最近参与的InfoPath Forms Services的项目,需要实现下拉列表的联动。我在网上搜索了不少资料,其中有一种解决的方案:http://blogold.chinaunix.net/u/18783/showart_2199801.html。
但这种解决方案没有考虑到显示值和值的区分。
现在考虑用其他的方式。
数据源设置:
节点设置:
二级节点关联设置:
关键部分代码,针对省份_Changed事件的处理:
public
void
省份_Changed(
object
sender, XmlEventArgs e)
{
if ( ! e.NewValue.Equals( string .Empty))
{
// 备选项,也可以根据业务连接数据库或者读取XML文件
string [] HubeiCityKeyList = { " 武汉 " , " 襄樊 " };
string [] HubeiCityValueList = { " Wuhan " , " Xiangfan " };
string [] HunanCityKeyList = { " 长沙 " , " 邵阳 " };
string [] HunanCityValueList = { " Changsha " , " Shaoyang " };
CreateNavigator().SelectSingleNode( " /my:myFields/my:市 " , NamespaceManager).SetValue( string .Empty);
switch (e.NewValue)
{
case " 湖北省 " :
{
InsertNode(HubeiCityKeyList, HubeiCityValueList);
break ;
}
case " 湖南省 " :
{
InsertNode(HunanCityKeyList, HunanCityValueList);
break ;
}
}
}
else
{
ClearCityNode();
}
}
private void InsertNode( string [] keyArray, string [] valueArray)
{
ClearCityNode();
// 添加备选节点
int j = 0 ;
XPathNavigator oXPathNavigator = null ;
for ( int i = 0 ; i < keyArray.Length; i ++ )
{
oXPathNavigator = CreateNavigator().SelectSingleNode( " /my:myFields/my:市备选[last()] " , NamespaceManager);
oXPathNavigator.SelectSingleNode( " my:市备选key " , NamespaceManager).SetValue(keyArray[i]);
oXPathNavigator.SelectSingleNode( " my:市备选value " , NamespaceManager).SetValue(valueArray[i]);
oXPathNavigator.InsertAfter(oXPathNavigator.OuterXml);
j ++ ;
}
if (j > 0 ) oXPathNavigator.DeleteSelf();
}
private void ClearCityNode()
{
// 清空备选节点
for ( int i = 0 ; i < CreateNavigator().Select( " /my:myFields/my:市备选 " , NamespaceManager).Count - 1 ; i ++ )
{
CreateNavigator().SelectSingleNode( " /my:myFields/my:市备选[last()] " , NamespaceManager).DeleteSelf();
}
CreateNavigator().SelectSingleNode( " /my:myFields/my:市备选/my:市备选key " , NamespaceManager).SetValue( string .Empty);
CreateNavigator().SelectSingleNode( " /my:myFields/my:市备选/my:市备选value " , NamespaceManager).SetValue( string .Empty);
}
{
if ( ! e.NewValue.Equals( string .Empty))
{
// 备选项,也可以根据业务连接数据库或者读取XML文件
string [] HubeiCityKeyList = { " 武汉 " , " 襄樊 " };
string [] HubeiCityValueList = { " Wuhan " , " Xiangfan " };
string [] HunanCityKeyList = { " 长沙 " , " 邵阳 " };
string [] HunanCityValueList = { " Changsha " , " Shaoyang " };
CreateNavigator().SelectSingleNode( " /my:myFields/my:市 " , NamespaceManager).SetValue( string .Empty);
switch (e.NewValue)
{
case " 湖北省 " :
{
InsertNode(HubeiCityKeyList, HubeiCityValueList);
break ;
}
case " 湖南省 " :
{
InsertNode(HunanCityKeyList, HunanCityValueList);
break ;
}
}
}
else
{
ClearCityNode();
}
}
private void InsertNode( string [] keyArray, string [] valueArray)
{
ClearCityNode();
// 添加备选节点
int j = 0 ;
XPathNavigator oXPathNavigator = null ;
for ( int i = 0 ; i < keyArray.Length; i ++ )
{
oXPathNavigator = CreateNavigator().SelectSingleNode( " /my:myFields/my:市备选[last()] " , NamespaceManager);
oXPathNavigator.SelectSingleNode( " my:市备选key " , NamespaceManager).SetValue(keyArray[i]);
oXPathNavigator.SelectSingleNode( " my:市备选value " , NamespaceManager).SetValue(valueArray[i]);
oXPathNavigator.InsertAfter(oXPathNavigator.OuterXml);
j ++ ;
}
if (j > 0 ) oXPathNavigator.DeleteSelf();
}
private void ClearCityNode()
{
// 清空备选节点
for ( int i = 0 ; i < CreateNavigator().Select( " /my:myFields/my:市备选 " , NamespaceManager).Count - 1 ; i ++ )
{
CreateNavigator().SelectSingleNode( " /my:myFields/my:市备选[last()] " , NamespaceManager).DeleteSelf();
}
CreateNavigator().SelectSingleNode( " /my:myFields/my:市备选/my:市备选key " , NamespaceManager).SetValue( string .Empty);
CreateNavigator().SelectSingleNode( " /my:myFields/my:市备选/my:市备选value " , NamespaceManager).SetValue( string .Empty);
}
效果图: