解决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]);
}
}
}
今天打开联动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]);
}
}
}
相关文章推荐
- 完美解决动态二级下拉菜单联动问题
- 完美解决动态二级下拉菜单联动问题
- 用.net制作排序、分页解决数据大的问题
- 解决jquery tablesorter2.0插件中文排序错误的问题
- 解决 asp.net 中如果 Menu 控件放在 MasterPage 中, IE6 会出现的二级菜单不能正确显示的问题
- extjs4.0 解决grid中文排序错乱问题~~~
- Oracle数据库order by排序查询分页比不分页还慢问题解决办法
- Lucene搜索结果排序问题(按时间倒序排的替代解决方法)
- 线程基础:多任务处理——Fork/Join框架(解决排序问题)
- 排序算法--7大排序问题解决方法
- 九度奥运排序问题,本周博客系统开发遇到一些问题的解决
- datagrid因排序造成的添加删除问题解决方案
- dwr二级联动中的小问题——第二级菜单中内容显示问题
- 解决char型主键排序问题
- dedecms自定义表单用js代替联动类型解决联动问题
- mysql分页加排序数据重复问题解决方案
- 利用动态SQL解决排序问题
- 解决TreeSet类的排序问题
- 解决InfoPath 2007表单的部署问题
- Android 彻底解决城区县三级联动问题(3D,2维)