希望 永远是快乐的.

有一种沉默叫霸气,有一种内敛叫个性,有一种简单叫深遂,有一种不屑叫自我。

导航

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

在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]);
                }
            }
        }

posted on 2010-01-28 13:12  希望(Jack)  阅读(477)  评论(0编辑  收藏  举报