infopath中界面控件和数据源的绑定
infopath提供了很好的界面设计器,可以非常方便地将数据源中的数据域和界面上的输入控件绑定。这样用户的输入就会纪录在最终的xml结果文件中。
常用的绑定方式
1 对于不重复的数据域的绑定是非常简单的。 在定义了数据源之后,把数据域直接托拽到View中,一个默认的界面控件就产生了,它的绑定域指向了这个数据域。
你可以改变控件的类型。方法是选中这个控件,右键菜单中选择change to,然后从列表中选择新的控件类型。
你也可以修改一个控件的绑定域,方法是选中这个控件,右键菜单中选择change binding,然后重新选择绑定域。
2 对于重复的数据域(Group中的数据域),如果一个group需要和一个外部数据连接绑定时,除了绑定域的设置,还需要设置数据过滤条件。
例如:一个讲师的Group需要和一个外部数据连接GetSpeakers绑定。
数据域的结构
Speaker(Group)
|----SpeakerName (Field)
|----SpeakerID (Field)
外部数据连接:GetSpeakers的返回xml
myFields
|--dataFields
|--Speaker
|--Alias
|--ID
界面控件是一个讲师姓名的列表(dropdownlist),绑定到SpeakerName数据域。要求当用户从界面控件选择SpeakerName时,自动将该讲师的ID记录到SpeakerID中。
在列表的属性里,设置rule.新建一个set id的规则,Action选择Set a field's value,有两个参数。
第一个是被赋值的field,选择SpeakerID。
第二个参数是赋值的value,先选择外部数据连接GetSpeakers的ID,然后打开Edit xPath的高级按钮,看到具体的取值方法:xdXDocument:GetDOM("GetSpeaker")/dfs:myFields/dfs:dataFields/dfs:Speaker/@ID
注意:如果按照这样的设置。每次取到的值都是GetSpeakers的第一个讲师的ID,而不是当前被选中名字的讲师的ID,这是因为GetSpeakers返回的结果不是一个讲师,而是多个,如果只取一个结果,则自动将第一个返回。
怎么办,需要加上判断条件,因为每个讲师的名字都是不同的,我们将使用被选中讲师的名字作为过滤条件,从GetSpeakers中过滤出那个讲师对应的ID
将公式改为xdXDocument:GetDOM("GetSpeaker")/dfs:myFields/dfs:dataFields/dfs:Speaker/@ID[@Alias = current()/../SpeakerName]
[@Alias = current()/../SpeakerName]是这个取值公式的过滤条件. @Alias是GetSpeakers中Alias的值,current()/../SpeakerName是当前group的SpeakerName的值。current()/../SpeakerName的语法和文件目录的语法一样。current()表示当前节点,..是上一级。