[C#.NET][Infopath 2007] 如何在 Form Service 利用Web Service過濾下拉選單內容 / How to Use Web Service Filter Dropdown Content in Form Service
在上一篇[Infopath 2007] 如何在 Form Service 使用下拉式清單,過濾內容 / How to Use DropDwon List Filter Content in Form Service,有提到過濾下拉選單的方式,這篇只是換成使用Web Service的方式,後端資料庫仍是使用Sharepoint的清單
準備Web Service,這隻程式需要帶入三個參考值,在設定Infopath時記得傳入。
/// <summary>
/// 過濾字串
/// </summary>
/// <param name="WebName">Web 名稱,若不輸入則表示開啟頂層網站</param>
/// <param name="ListName">清單名稱</param>
/// <param name="CityName">欲帶入比較的名稱</param>
/// <returns></returns>
[WebMethod]
public List<string> FilterString(string WebName,string ListName,string CityName)
{
string url;
try
{
url = SPContext.Current.Site.Url;
}
catch (Exception ex)
{
url = "http://win-83s5zz3cd3d";
}
List<string> ResultList = new List<string>();
using (SPSite osite = new SPSite(url))
{
SPWeb oweb = null;
if (WebName=="")
{
oweb = osite.OpenWeb();
}
else
{
oweb = osite.AllWebs[WebName];
}
SPList list = oweb.Lists[ListName];
foreach (SPItem item in list.Items)
{
string city = item["City"].ToString();
//因為該欄是使用查詢方式,所以資料格式為
//4;#台南市,下段程式則是處理不必要的字串
city=city.Substring(city.LastIndexOf('#') + 1);
string area = item["Area"].ToString();
area = area.Substring(area.LastIndexOf('#') + 1);
if (CityName==city)
{
ResultList.Add(area);
}
}
oweb.Dispose();
}
return ResultList;
}
接下來設定Infopath表單
分別設定資料連線"City"、"Area"、FilterString
設定欄位
設定完成後即可測試資料是否傳輸正常,果然~資料傳遞是正常的
既然本篇的結果與上篇 [Infopath 2007] 如何在 Form Service 使用下拉式清單,過濾內容 / How to Use DropDwon List Filter Content in Form Service 結果一樣,都是要寫程式,那究竟要選擇哪一種比較好呢?
上篇方法是利用資料連線,把資料撈回來Infopath處理資料,"撈取"這個動作只做一次即可,除非你的後端資料庫一直在變更;Infopath表單裡 需要 綁Code。
本篇方法則是透過Web Service,把資料丟到Web Service,再撈取;也就是說每當User點選一次資料,"撈取"這個動作就做一次;Infopath表單裡 不需要 綁Code。
效能來看是上篇佔了較大的優勢,但若已產品更新的角度來看,或許本篇的方法在未來更新時比較不痛,但是這種事誰也說不準。
在這次的範例中,我曾試著在Infopath用不寫Code的方式,傳遞DataSet或是List<>資料給Web Service,但失敗了;Infopath這套產品似乎無法丟Collection的資料給Web Service,可能是我哪裡做錯了,我需要時間去找出答案來,若有答案再來分享。
Sample Download:DropdownFilter.rar
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET