[C#.NET][Infopath 2007] 如何在 Form Service 利用Web Service過濾下拉選單內容 / How to Use Web Service Filter Dropdown Content in Form Service

[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的清單

2010-3-5 下午 02-55-11

準備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

2010-3-5 下午 07-03-38

設定欄位

2010-3-5 下午 03-01-50

設定完成後即可測試資料是否傳輸正常,果然~資料傳遞是正常的

2010-3-5 下午 07-12-59

 

既然本篇的結果與上篇 [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

Image result for microsoft+mvp+logo