[Infopath 2007] 如何在 Form Service 使用下拉式清單,過濾內容 / How to Use DropDwon List Filter Content in Form Service
很不幸的,在Form Service下,不支援下拉式選單過濾,我只能透過程式的方式來達成過濾功能,今天我將利用Sharepoint清單當作後端資料庫,利用Infopath既有的功能再搭配程式碼,以減少開發時間,Infopath在處理Sharepoint清單相當方便,還不熟的人可以前往M$的教學網站,http://office.microsoft.com/zh-tw/infopath/HP100931601028.aspx
Step1.首先準備兩個Sharepoint清單(Cities、CityDistrict),清單內容如下
Step2.在Infopath裡準備欄位如下
Step3.連線到Sharepoint清單(CityDistrict)
Step3.設定City欄位為下拉式選單,資料來源為Cities,並指定City欄位
Step4.設定District欄位為下拉式清單,資料來源為表單來源,並指定Districts欄位
Step5.在City事件中加入以下程式碼
{
if (e.Site.Value == "")
return;
//取得parent路徑
XPathNavigator ParentXPath = e.Site.SelectSingleNode("..");
//建立XPathNavigator集合
List<XPathNavigator> Nodes = new List<XPathNavigator>();
//複製資料格式
foreach (XPathNavigator node in ParentXPath.Select("my:Districts", NamespaceManager))
{
Nodes.Add(node.Clone());
}
//刪除資料
foreach (XPathNavigator node in Nodes)
{
node.DeleteSelf();
}
//定義過濾字串
string MatchRoleXPath = String.Format("/dfs:myFields/dfs:dataFields/dfs:CityDistrict[@Cities = '{0}']", e.Site.Value);
//定義資料庫連線
XPathNavigator SubData = DataSources["CityDistrict"].CreateNavigator();
XPathNodeIterator SubDataReTable = SubData.Select(MatchRoleXPath, this.NamespaceManager);
foreach (XPathNavigator SelectedNode in SubDataReTable)
{
//取出過濾字串
string value = SelectedNode.SelectSingleNode("@District").Value;
//寫入資料
using (XmlWriter writer = ParentXPath.AppendChild())
{
writer.WriteElementString("Districts", NamespaceManager.LookupNamespace("my"), value);
}
}
}
執行畫面如下
PS.本方法是利用表單內的重複表格(Districts),存放過濾後的資料,這是為了讓District欄位能夠展現出過濾後的結果。
操作畫面如下:
範例下載:DropDownFilter.rar
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET