在重複表中實現聯動下拉列表框
如果用前面兩篇文章的方法在重複表中實現聯動下拉列表框就會有問題。即當你更改重複表中的某一行上級下拉列表框時,所有行的下級下拉列表框的選項都會變成相同的內容。產生這種問題的原因是重複表中的所有行的下級下拉列表框都採用同一個輔助數據源,而任何一個上級下拉列表框變動時都會改變這個輔助數據源。要想解決這個問題,就必須爲每個下級下拉列表框設置不同的數據源,筆者在infopathdev博客上發現一篇文章(參考資料[3]),從中找到了解決方案。
解決方案的思路是這樣的:在重複表中添加一個重複的域,將這個域作爲下級下拉列表框的數據源;當同一行的上級下拉列表框變動時,程序將更新這個重複域。由於重複表的每行都有本行的重複域,所以每行的下級下拉列表框的數據源是不同的,不會相互影響。下面演示詳細實現步驟。
第一步,準備數據源列表。
本例需要一個原始數據源,仍然使用上篇文章中創建的SharePoint列表——Cities。重複表中的重複域的值是它的一個子集,是根據上級下拉列表框的值過濾得來的。
第二步,設計InfoPath表單。
1.表單上要放置一個重複表,重複表中放置兩個下拉列表框ddlb1和ddlb2,在主數據源中添加一個重複域ddlb2Source,如下圖。
2.確認域ddlb2Source的屬性框中選擇“重複”。
3.下拉列表框ddlb2的列表框項選擇“在表單數據源中查找值”,項選擇爲“/my:myFields/my:group1/my:group2/my:ddlb2Source”。
4.下拉列表框ddlb1屬性的“瀏覽器表單”頁,確認回發設置爲“始終”。
5.創建數據連接,指向SharePoint列表Cities,方法參見上一篇文章。
6.確認“啓用瀏覽器兼容性功能”,確認安全級別爲“完全信任”,方法參見上一篇文章。
第三步,VSTA編程。
在InfoPath表單設計界面右鍵點擊ddlb1,在出現的菜單中選擇編程/Changed事件,進入VSTA編程環境。在ddlb1_Changed事件中插入下面代碼。
添加代碼後的VSTA編程界面如下圖。
第四步,發佈InfoPath表單。
方法略,參見上一篇文章。
第五步,應用內容類型。
方法略,參見上一篇文章。
新建表單測試一下,界面如下圖。
這種方法雖然可以在重複表中實現聯動下拉列表框,但是性能不是太好。由於重複表中每行都要存儲一個下拉列表框的數據源,如果重複表的行比較多,則性能必然會受到影響,這是該解決方案的主要缺點,目前沒有更好的解決方案。我們期待InfoPath的下一版本能解決這個問題。
源碼下載:ddlbEx3.rar
參考資料
[3]. Implementing Cascading Dropdowns in Forms Server, David Airapetyan,http://www.infopathdev.com/blogs/david/archive/2007/08/23/implementing-cascading-dropdowns-in-forms-server.aspx
本文出處:>>http://www.cnblogs.com/sean_zhang