通过VSTA编程实现联动下拉列表框
VSTA(Visual Studio Tools for Applications )是微软免费提供的方便开发人员定制应用程序的工具,它的作用和VBA类似,可以为应用程序的二次开发人员提供一个Visual Studio环境以及C#和VB.NET语言进行插件的开发,我们可以简单的把它看成是VBA的.Net升级版,目前微软的Office2007完全支持这项技术。下面我们详细说明实现通过VSTA编程实现联动下拉列表框的过程。
第一步,准备作为下拉列表框数据源的列表。
通过规则实现联动下拉列表框的方法要求必须以带参数查询的Web Service作为数据源,而下文中的方法对数据源没有特殊要求。所以,我们选择最简单的SharePoint列表作为数据源。在SharePoint服务器上创建一个自定义列表Cities,为这个列表增加两个栏,栏名为City和Province,类型都为“单行文本”。创建好列表后输入一些测试数据,如下图。
第二步,设计InfoPath表单。
1. 我们创建一个与上一篇界面相同的表单,但是数据连接不同,也不需要添加规则。表单上同样要放置两个下拉列表框ddlb1和ddlb2。
2. 进入下拉列表框ddlb1的属性对话框,在“数据”页中,手动输入两个选项“四川”和“新 疆”。注意,这次要保留第一行默认的空值(显示名称“选择…”)。
3. 在下拉列表框ddlb1属性的“浏览器表单”页,确认回发设置为“始终”。
4. 需要强调两点:第一,创建表单模板时一定要钩选“仅启用浏览器兼容性功能”,或者也可以在设计表单时选择菜单工具/表单选项,进入表单选项对话框,在“类别”中选择“兼容性”,钩选“设计一个可在浏览器或InfoPath中打开的表单模板”,作用与前者相同。
第二,在表单选项中选择“安全和信任”,不钩选“自动确定安全级别”,而选择“完全信任”。因为如果在表单中加入VSTA编程,表单安全级别必须为“完全信任”,否则程序无法运行。因为表单安全级别为“完全信任”,发布表单步骤就与普通表单不同了,后面的文章会详细说明发布安全级别为“完全信任”的表单的步骤。
5. 以上界面设计完毕后接着添加数据连接,启动“数据连接向导”,
A. 选择将SharePoint列表作为数据源。
B. 进入下一步,输入SharePoint网站的地址;
C. 进入下一步,选择列表Cities。
D. 进入下一步,选择列表的域Province和Cities,如下图。
E. 在向导最后一步,不要钩选“在打开表单时自动检索数据”,点击“完成”按钮。
数据连接创建完毕后,接着就要设置下拉列表框ddlb2的数据源。在ddlb2属性对话框“数据”页的“列表框项”下选择“从外部数据源查找值”,将“数据源”设置为Cities,“项”设置为:
/dfs:myFields/dfs:dataFields/dfs:Cities
“值”为:@City
“显示名称”为:@City
完成上述步骤,InfoPath表单就设计好了,将这个表单模板保存为ddlb2.xsn。下一步就要进行VSTA编程来实现下拉列表框联动。
第三步,VSTA编程。
要进行VSTA编程必须安装VSTA软件开发工具包,笔者使用的版本是Visual Studio 2005 Tools for Applications Software Development Kit (SDK),下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=7C2EA8AE-E051-449A-9051-3A351BF27B7F&displaylang=en&displaylang=en
编程的思路是,系统侦听下拉列表框ddlb1的Changed事件,一旦ddlb1的值发生变化,系统将重新检索ddlb2的数据源,并按照ddlb1的值进行过滤,删除不符合条件的值,只保留符合条件的值。下面用到的代码源于国外ICT专家Frederik博客中的文章《HOW TO use Cascading Dropdown List Boxes within an InfoPath Web Form》(参考资料[2])。
下面详细说明操作步骤。
在InfoPath表单设计界面右键点击ddlb1,在出现的菜单中选择编程/Changed事件,进入VSTA编程环境。在ddlb1_Changed事件中插入下面代码。
在FormCode类中插入下面自定义函数的代码。
添加代码后的VSTA编程界面如下图。
下面对代码中自定义函数作简单说明。
参数 | 说明 |
dataConnectionName | 数据连接名称,该数据连接是下拉列表框ddlb2数据源的数据连接,在本例中值应为“Cities”。 可以从菜单工具/数据连接打开数据连接对话框。
|
dataSourceName | 数据源名称,指下拉列表框ddlb2的辅助数据源,应该与对应数据连接同名。可以从菜单视图/任务窗格打开数据源视图。
|
ForeignKey | 设置过滤条件的Field的名称,这个Field的设置值应该与下拉列表框ddlb1的值对应。在本例中该参数值应为“Province”。 |
CascadingDropDownDataSourceField | 联动的下级下拉列表框(bblb2)的XPath值,打开数据源视图,选择主数据源,右键点击ddlb2,在弹出的菜单上选择复制XPath可获得该参数值,在本例中应为“/my:myFields/my:ddlb2”。
|
selectedMainValue | 联动的上级下拉列表框(ddlb1)的值,该函数会根据此值过滤ddlb2的选项。可通过ddlb1_Changed事件自带参数e.NewValue获得,该值即ddlb1变化后的新值。 |
repeatingNode | 下拉列表框bblb2的数据源中作为选项Node的XPath值,可以从ddlb2的属性对话框中看到,也可以在数据源视图中“复制XPath”得到。在本例中应为“/dfs:myFields/dfs:dataFields/dfs:Cities”。
|
完成编写代码后,可以在VSTA环境中启动调试,观察运行结果。如果程序能在InfoPath客户端中成功运行,下一步就可以向InfoPath Forms Services发布这个表单了。
第四步,发布InfoPath表单。
前面提到过,由于本表单模板的安全级别是“完全信任”,因而发布过程不同于一般InfoPath表单,发布这种表单的过程稍微复杂一些,下面是发布过程。
1. 首先,启动发布表单模板向导,选择“具有或不具有InfoPath Form Services的SharePoint服务器”;
2. 进入下一步,输入SharePoint网站地址;
3. 进入下一步,一定要确认钩选“使用户可以通过浏览器填写此表单”。
4. 进入下一步,填写发布后模板存放的位置和文件名称,本例我们填写“d:/ddlb2pub.xsn”。
5. 进入下一步,再点击下一步就可以发布了。
发布向导完成后,记住发布文件的位置,后面的操作会把这个文件上传到SharePoint服务器上。
第五步,应用内容类型。
下面还需要以管理员身份登录SharePoint管理中心上传表单模板,并添加表单库的内容类型,操作如下。
1. 上载表单模板。在SharePoint管理中心的应用程序管理页面,点击InfoPath Forms Services下面的“上载表单模板”;进入上载表单模板页面,输入前面发布的表单模板的位置和文件名“d:/ddlb2pub.xsn”。点击上载按钮,等待一会儿,会出现上载成功的页面;点击确定后,会进入管理表单模板页面。这时会看到刚上载的表单模板ddlb2pub.xsn这一项,要注意这项的状态。如果状态为“就绪”,说明完全安装成功。如果状态为“正在安装”,就要等一会儿在刷新页面,直到状态变为“就绪”为止。如果长时间处于“正在安装”状态,就要检查“Windows SharePoint Services Timer”这个服务是否启动,如果没启动则启动它,或者手动执行命令“stsadm –o execadmsvcjobs”完成表单模板安装。
2. 激活到网站集。表单模板就绪后,还需要激活表单模板。从表单模板ddlb2pub.xsn的下拉菜单选择“激活到网站集”。在激活表单模板页面中,网站集一项选择要使用这个表单的网站集,点击确定即可。
3. 添加内容类型。我们需要将这个内容类型应用到一个SharePoint列表或库上(为了简便,本例我们还是选用上一篇文章中创建的表单库ddlb,但需要将该库设置为“允许管理内容类型”)。在表单库的设置页面,在内容类型下面点击“从现有网站内容类型添加;入添加内容类型页面,从可用网站内容类型列表中选择ddlb2pub,点击“添加”按钮,再点击“确定”按钮。
完成后该内容类型会列在表单库的设置页面的内容类型下面。如果不喜欢缺省名称,可以点击该内容类型,将名称改为“VSTA表单”。
至此,内容类型添加完毕,下面可以测试了。在ddlb表单库页面,点击“新建”下拉菜单,选择“VSTA表单”。
上面步骤详细说明了VSTA编程实现联动下拉列表框的操作过程。这种方法的优点是对下拉列表框的数据源没有限制,由于VSTA功能强大,还可以扩展更多的功能,灵活性是其它方法无可比拟的;但是,表单发布比较复杂,而且要求有管理员权限。
本文和上一篇文章中讲述的方法都不能在重复表中实现联动的下拉列表框,下一篇将讲述如何在重复表中实现联动的下拉列表框。
源码下载:ddlbEx2.rar
参考资料
[2]. HOW TO use Cascading Dropdown List Boxes within an InfoPath Web Form, Frederik Van Lierde,http://www.silversandsassociates.com/HOW_TO_use_Cascading_Dropdown_ListBoxes_within_an_InfoPath_Web_Form.pdf
本文出处:>>http://www.cnblogs.com/sean_zhang