JOJ
踏踏实实做人,认认真真做事!放纵自己就是毁灭自己!

英文原文:http://www.sharepoint-tips.com/2007/01/infopath-form-services-implementing.html 

1.

在用数据库或者JS中我们也许做过类似城市级联功能! 这里使用infoPath表单  ,从sharepoint列表中获取数据!

首先新建2个自定义列表:  province 和 cities

1 province只要一个title字段!

在cities列表中 创建一列名为 :province 相

2

cities添加数据的时候,province的数据就会读取 province 列表里 title字段的值!

3

目前2张列表数据准备就绪!

1

2.

  1. 打开infopath,创建一个空白的表单!
  2. 先做一些设置:工具-->表单选项-->安全和信任:完全信任 ; 编程: 选择C# [当然如果你喜欢VB的话,也可以不修改哈]

如果你不设置安全和信任为 完全信任,也许你将得到这个错误:

1

  1. 在右边设计任务:控件拖放2个 dropdownlist ,右键-->下拉列框属性--如图:
  2. 1
  3. 先点击添加-->仅接受数据—>Sharepoint 库或者列表 -->键入: http://moss/Lists/province/AllItems.aspx -->选中province列表-->选中 Title 字段!  最后数据源选择province,项设置好!
  4. 在浏览器打开 http://moss/_vti_bin/owssvr.dll?Cmd=Display&List={CD8B96B9-F9FE-4055-9E0B-9EC56B46A4F5}&XMLDATA=TRUE , 其中moss 替换为你的站点 ,List={CD8B96B9-F9FE-4055-9E0B-9EC56B46A4F5} 其中花括号里面的guid为 cities 列表的GUID ,你可以依次点击cities列表—>Setting—>List Settings , 然后地址栏就会出现  http://moss:/_layouts/listedit.aspx?List={CD8B96B9-F9FE-4055-9E0B-9EC56B46A4F5} 把里面的guid替换到上面的, 注意,你可能会得到List=%7BE484AC2C%2D148F%2D4856%2D80B6%2D11CA0B84E624%7D ,那是由于把{} 编码了, 你自行解码即可! 使用 Server.UrlDecode() ,浏览器打开上面地址,你将得到:
  5. xml 当看到这个XML文件的时候,表示数据可以取到了! 可以关闭浏览器了!
  6. 右键第二个下拉框(city):  下拉列框属性--如图:
  7. 2
  8. 先点击添加-->仅接受数据—>XML文档 -->键入: http://moss/_vti_bin/owssvr.dll?Cmd=Display&List={CD8B96B9-F9FE-4055-9E0B-9EC56B46A4F5}&XMLDATA=TRUE  (该链接即上面打开XML的链接)-->选中从指定位置访问数据(下面的也选上[数据副本])-->键入数据链接名称:cities 和选中"在打开表单时自动检索数据"  . 这时你去数据连接的时候看看XML文件的地址就是上面的地址!(owssvr即cities)

1

现在点击 预览 按钮,可以看到,2个dropdwonlist都有值, 但是 city不会随上面的 province 变化! 接下来需要 编辑province Changed事件 !

如下图:打开VSTA开发环境,写自己熟悉的C#代码!

3

把下面的代码Copy到你的工程中

public void province_Changed(object sender, XmlEventArgs e)
        {
            SetCitiesOptions(e);
        }
        private void SetCitiesOptions(XmlEventArgs e)
        {
            //cities 为刚才第10布,键入数据链接名称:?cities 
            FileQueryConnection q = (FileQueryConnection)this.DataConnections["cities"];
            MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:city", NamespaceManager).SetValue("");
            //这?里?的?FilterField1=province , province为?上?面?ows_province去?掉?ows_的?剩?下?部?分?, 其?实?也?是?你?在?cities列?表?中?province项?, 
            q.FileLocation = q.FileLocation + "&FilterField1=province&FilterValue1=" + e.NewValue;
            //断?点?调?试?q.FileLocation = http://moss/_vti_bin/owssvr.dll?Cmd=Display&List={CD8B96B9-F9FE-4055-9E0B-9EC56B46A4F5}&XMLDATA=TRUE&FilterField1=province&FilterValue1=四?川?省?
            //可?把?该?地?址?复?制?到?浏?览?器?,即?可?看?到?查?询?的?结?果?
            q.Execute();
        } 

 

我遇到的问题:

 

1.
System.Collections.Generic.KeyNotFoundException
The given key was not present in the dictionary.
   at System.ThrowHelper.ThrowKeyNotFoundException()
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at Microsoft.Office.InfoPath.Internal.DataConnectionsHost.get_Item(String name)
   at province.FormCode.SetCitiesOptions(XmlEventArgs e) in D:\Users\Documents\InfoPath Projects\province\FormCode.cs:line 40
   at province.FormCode.province_Changed(Object sender, XmlEventArgs e) in D:\Users\Documents\InfoPath Projects\province\FormCode.cs:line 35
   at Microsoft.Office.InfoPath.Internal.XmlEventHost.GenericProxy(Object genericDelegate, DataDOMEvent dataDOMEvent, InfoPathEvents type)
   at Microsoft.Office.InfoPath.Internal.XmlEventHost.ChangedProxy(DataDOMEvent dataDOMEvent)
   at Microsoft.Office.Interop.InfoPath.SemiTrust._DataDOMEventSink_SinkHelper.OnAfterChange(DataDOMEvent pDataDOMEvent)
问题原因:FileQueryConnection q = (FileQueryConnection)this.DataConnections["cities"]; 这里的cities填写错误, 输入了其他数据名,或者大小写没有注意
 
2. 如果你选择第一个下拉列表,第二个为空,而且没有抛出任何错误,你可以断点这里q.FileLocation = q.FileLocation 
+ "&FilterField1=province&FilterValue1=" + e.NewValue;  把得到的链接在浏览器打开,看是否也为空,如果同样为空,则
FilterField1=province的province字段你写错了或者数据本来就为空(如:列表中四川下面你没有填写任何城市)!
 
3.
System.Net.WebException
InfoPath has encountered an error. The operation failed.

The form's code contains an error. 

The following call in the form's code failed: XMLFileAdapter.Query
Operation aborted

   at Microsoft.Office.InfoPath.Internal.MomExceptionHelper.ExecuteDataConnectionAction(OMCall d)
   at Microsoft.Office.InfoPath.Internal.FileQueryConnectionHost.Execute()
   at province.FormCode.SetCitiesOptions(XmlEventArgs e) in D:\Users\Documents\InfoPath Projects\province\FormCode.cs:line 55
   at province.FormCode.province_Changed(Object sender, XmlEventArgs e) in D:\Users\Documents\InfoPath Projects\province\FormCode.cs:line 35
   at Microsoft.Office.InfoPath.Internal.XmlEventHost.GenericProxy(Object genericDelegate, DataDOMEvent dataDOMEvent, InfoPathEvents type)
   at Microsoft.Office.InfoPath.Internal.XmlEventHost.ChangedProxy(DataDOMEvent dataDOMEvent)
   at Microsoft.Office.Interop.InfoPath.SemiTrust._DataDOMEventSink_SinkHelper.OnAfterChange(DataDOMEvent pDataDOMEvent)
问题原因:在操作第8不的时候,错误的将XML文件保存下来,而且下面错误的浏览了本地文件,而是应该键入:http://moss/_vti_bin/owssvr.dll?Cmd=Display&List={CD8B96B9-F9FE-4055-9E0B-9EC56B46A4F5}&XMLDATA=TRUE 即可!
1 
 
其他相关文字:http://www.cnblogs.com/sean_zhang/archive/2009/07/27/1532009.html
 
Technorati 标签: sharepoint,infopath
posted on 2010-11-17 18:03  JoinJ  阅读(1479)  评论(0编辑  收藏  举报