通过编程方式在InfoPath 2010表单的下拉框修改事件中获取数据
一个简单的例子,包括一段简短的代码,在InfoPath 2010表单中下拉框的修改事件里从一个数据源获取数据。
表单
样例表单本身很简单,只有两个控件,如下图所示:
在mydropdown下拉框属性中,添加几个值,为将要获取的SharePoint列表中已有的几个列表项的ID。
另外,在浏览器表单选项卡中,设置始终获取数据。以便在下拉框值发生修改时,自动获取数据。
设置好表单布局后,点击功能区“数据”选项卡中的“数据连接”,设置一个数据源。
在弹出的“数据连接”对话框中,点击“添加...”。打开数据连接向导对话框。选择“接收数据”。
下一步。选择“SharePoint库或列表”
下一步。输入SharePoint网站地址。
下一步。选择需要连接的列表。
下一步。选择域。在下面的代码中,我们会用到Title,所以这里把它选中。
一路下一步,直到完成该向导。将我们的数据连接命名为“MyDATASOURCE”。
选中下拉框控件,点击功能区“开发工具”选项卡下控件事件组中的“Changed事件”。
将打开VSTA集成开发环境。
代码
下面的代码中,InternalStartup()方法用于注册下拉框的修改事件,mydropdown_Changed()方法用于实际的从数据源获取数据...
“MyDATASOURCE”是为了获取表单域field1的值,也就是来自SharePoint列表数据源(MyDATASOURCE)的SharePoint列表项标题。
通过Web服务传递给数据源的参数是列表项ID,由下拉框的当前值决定。
using Microsoft.Office.InfoPath; using System; using System.Xml; using System.Xml.XPath; namespace Getdatanamespace { public partial class FormCode { // 注意: 以下是 Microsoft InfoPath 所需的过程。 // 可以使用 Microsoft InfoPath 对其进行修改。 public void InternalStartup() { EventManager.XmlEvents["/my:myFields/my:mydropdown"].Changed += new XmlChangedEventHandler(mydropdown_Changed); } public void mydropdown_Changed(object sender, XmlEventArgs e) { // 在此处编写代码,用于更改主数据源。 XPathNavigator form = MainDataSource.CreateNavigator(); // 为Web服务调用和查询连接准备参数 // 发送ID作为调用web服务的参数,用于访问该数据源 DataSources["MyDATASOURCE"].CreateNavigator().SelectSingleNode("dfs:myFields/dfs:queryFields/q:SharePointListItem_RW/q:ID",NamespaceManager).SetValue(e.NewValue); DataSources["MyDATASOURCE"].QueryConnection.Execute(); // 基于web服务的响应创建一个 navigator XPathNavigator resultnav = DataSources["MyDATASOURCE"].CreateNavigator(); // 用web服务响应中的数据设置字段的值 XPathNavigator Field1 = form.SelectSingleNode("/my:myFields/my:field1", NamespaceManager); Field1.SetValue(resultnav.SelectSingleNode("/dfs:myFields/dfs:dataFields/d:SharePointListItem_RW/d:Title",NamespaceManager).Value); } } }
运行
代码编写完成后,可以直接通过F5运行,将自动打开表单预览界面。
测试无误后,就可以发布到SharePoint表单库中了。
点击左上角的“文件”选项卡,打开后台视图。选择“发布”下的“SharePoint服务器”
跟随向导,一步步的进行就可以了。本例中,我们选择发布到表单库。
完成!点击“在浏览器中打开此表单”。
在SharePoint中运行的样子:
参考资料
Infopath 2010 form drop-down list change event get data programmatically