您的位置:首页 > 运维架构

解决infopath 二级联动的排序问题

2010-01-28 13:12 281 查看
在Infopath 联动的dropdown中,我们遇见dropdown不能排序的问题.先说说当初做infopath联动字段,一位同事引用了http://www.msotec.com/showtopic-1930.aspx代码. 解决了当时的燃眉之急. 但是后来用户用的时候,发现form表单很慢. 开始我并没注意这些,原因是因为我们的表单上做了大量的规则.导致性能下降.

今天打开联动code的时候,我发现很多地方可以优化.下面是优化的代码.

private void ActionReasonDataBind(string action)
{
if (action == string.Empty) return;
//Get Reason and BackReason
XPathNavigator ReasionDataSource = this.DataSources["Reason"].CreateNavigator();
XPathNavigator backReasionDataSource = this.DataSources["BackReason"].CreateNavigator();

//filter Reason based on action
string xPathString = string.Format("/dfs:myFields/dfs:dataFields/dfs:Reason[@Action='{0}']",action);
XPathNodeIterator newReasions = backReasionDataSource.Select(xPathString, this.NamespaceManager);

//Clear all Action Reason
ReasionDataSource = ReasionDataSource.SelectSingleNode("/dfs:myFields/dfs:dataFields",
NamespaceManager);
XPathNodeIterator Reasions = ReasionDataSource.SelectChildren(XPathNodeType.Element);
Reasions.Current.MoveToFirstChild();
do
{
Reasions.Current.DeleteSelf();
}
while (Reasions.Current.MoveToFirstChild());

//copy the reason value
if (newReasions.Count != 0)
{
newReasions.MoveNext();
do
{
Reasions.Current.AppendChild(newReasions.Current.Clone());
}
while (newReasions.MoveNext());
}
}

上面我说遇见排序的问题, 为了解决这个问题,我在MSDN转了半天,寻找关于xml的排序. 我们知道,通过sharepoint做的连接,获取的数据都是属性样式.如:

<dfs:Reason Action=" Hire" Reason="Sort Value"/>.

XPathExpression 不支持属性排序,很郁闷…,我甚至想用linq,但linq只能被.net framework 3.5 支持,而我的表单代码是.net framework 2.0的,升级可能导致不必要的错误.于是我用了中间变量 SortList.把过滤来所有的XPathNavigator 对象,先封存在SortList里面,并把Reason属性的值做key健.这样SortList就可以自动排序. 然后在把排序后的值赋给Reason dropdown,代码如下:

private void ActionReasonDataBind(string action)
{
if (action == string.Empty) return;
//Get Reason and BackReason
XPathNavigator ReasionDataSource = this.DataSources["Reason"].CreateNavigator();
XPathNavigator backReasionDataSource = this.DataSources["BackReason"].CreateNavigator();

//filter Reason based on action
string xPathString = string.Format("/dfs:myFields/dfs:dataFields/dfs:Reason[@Action='{0}']",action);
XPathNodeIterator newReasions = backReasionDataSource.Select(xPathString, this.NamespaceManager);

//Clear all Action Reason
ReasionDataSource = ReasionDataSource.SelectSingleNode("/dfs:myFields/dfs:dataFields",
NamespaceManager);
XPathNodeIterator Reasions = ReasionDataSource.SelectChildren(XPathNodeType.Element);
Reasions.Current.MoveToFirstChild();
do
{
Reasions.Current.DeleteSelf();
}
while (Reasions.Current.MoveToFirstChild());

//copy the xmlelement to SortList,in order to sort
SortedList sList = new SortedList();
if (newReasions.Count != 0)
{
newReasions.MoveNext();
do
{
sList.Add(newReasions.Current.SelectSingleNode("@Reason").Value, newReasions.Current.Clone());
}
while (newReasions.MoveNext());
}

//add Reason records into Action Reason Dropdownlist
if (sList.Count != 0)
{
foreach( object key in sList.Keys)
{
Reasions.Current.AppendChild((XPathNavigator)sList[key]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: