部落格觀察

聯絡我

Software

最新回應

預設情況下Form Service不提供多選功能,但我們仍可利用重複表格加程式碼達到功能

Step1.建立Sharepoint清單(Cities),如下圖

2009-12-28 上午 02-41-38_thumb[3]

Step2.建立Infopath資料欄位,Data欄位資料型態為RTF,其餘為String

2009-12-28 上午 02-42-56_thumb[7]

Step3.利用Infopath連線到Cities清單

2009-12-28 上午 02-46-59_thumb[4]

Step4.建立Infopath畫面如下

2009-12-28 上午 02-48-41_thumb[4]

Step5.讀取次要資料庫到DataTable(或是陣列)

按鈕事件中加入以下

//讀取次要資料庫
//=================================================================
//Connect Name
string ConnectName = "Cities";
//次要資料庫路徑
string ReTablePath = "/dfs:myFields/dfs:dataFields/dfs:Cities";
//DataTable的名稱
string DataTableName = "CitiesTable";
//次要資料庫的欄位
string[] ItemVariable = new string[] { "@City" };
//DataTable的欄位
string[] ColumnName = new string[] { "City" };
//取得資訊後存入DataTable,當然不一定要用DataTable,只是我習慣用DataTable
DataTable myTable = GetSubDatabase(ConnectName, ReTablePath, DataTableName, ItemVariable, ColumnName);

副程式如下

//取得次要資料庫的Repeat Table
private DataTable GetSubDatabase(string ConnectName, string ReTablePath, string DataTableName, string[] ItemVarible, string[] ColumnName)
{
    int LoopCon = ItemVarible.Length;
    //取得次要資料庫
    XPathNavigator SubData = DataSources[ConnectName].CreateNavigator();
    XPathNodeIterator SubDataReTable = SubData.Select(ReTablePath, NamespaceManager);
    //建立DataTable
    DataTable myTable = CreateDataTable(DataTableName, ColumnName);
    DataRow Rows = null;
    //取出資料庫的值
    while (SubDataReTable.MoveNext())
    {
        //新增Row
        Rows = myTable.NewRow();
        //取出資料
        for (int i = 0; i < LoopCon; i++)
        {
            XPathNavigator XPath = SubDataReTable.Current.SelectSingleNode(ItemVarible[i], NamespaceManager);
            string XPathString = string.Empty;
            if (XPath != null)
                XPathString = SubDataReTable.Current.SelectSingleNode(ItemVarible[i], NamespaceManager).Value;
            //寫入Row
            Rows[ColumnName[i]] = XPathString;
        }
        //寫入DataTable
        myTable.Rows.Add(Rows);
    }
    //Check Database
    int j = 0;
    foreach (DataRow row in myTable.Rows)
    {
        foreach (DataColumn col in myTable.Columns)
        {
            Debug.WriteLine(j.ToString() + " . " + col.Caption + ": " + row[col].ToString());
            j++;
        }
    }
    return myTable;
}
//建立DataTable
private DataTable CreateDataTable(string TableName, string[] ColumnName)
{
    //建立DataTable
    DataTable myTable = new DataTable(TableName);
    //定義Columns
    foreach (string column in ColumnName)
    {
        myTable.Columns.Add(column);
    }
    return myTable;
}

Step6.將DataTable寫入重複表格

按鈕事件下加入以下:

//寫入主要資料庫(重複表格)
//===================================================================================
//主要資料庫路徑
string MainSection = "/my:myFields/my:Group";
//主要資料庫Repeat Table的路徑
string MainReTable = MainSection + "/my:Retable";
//主要資料庫的欄位
ItemVariable = new string[] { "my:Title", "my:Option" };
//DataTable的欄位
ColumnName = new string[] { "City" };
SetRepeatTable(myTable, MainSection, MainReTable, ItemVariable, ColumnName);
副程式如下:
//設定重複表格
public void SetRepeatTable(DataTable myTable, string MainSection, string MainReTable, string[] ItemVariable, string[] ColumnNames)
{
    //取得主要資料庫
    XPathNavigator MainData = MainDataSource.CreateNavigator();
    XPathNavigator MainDataSection = MainData.SelectSingleNode(MainSection, NamespaceManager);
    XPathNavigator MainDataReTable = MainDataSection.SelectSingleNode(MainReTable, NamespaceManager); 

    //刪除舊的Repeat Table
    XPathNodeIterator AllData = MainDataSection.Select(MainReTable, NamespaceManager);
    XPathNavigator FirstRow = MainDataSection.SelectSingleNode(MainReTable + "[1]", NamespaceManager);
    XPathNavigator EndRow = MainDataSection.SelectSingleNode(MainReTable + "[" + Convert.ToString(AllData.Count) + "]", NamespaceManager);
    FirstRow.DeleteRange(EndRow);
    //取出DataTable
    foreach (DataRow Row in myTable.Rows)
    {
        foreach (string Column in ColumnNames)
        {
            //寫入Infopath主要資料庫
            MainDataReTable.SelectSingleNode(ItemVariable[0], NamespaceManager).SetValue(Row[Column].ToString());
            MainDataReTable.SelectSingleNode(ItemVariable[1], NamespaceManager).SetValue("no");
            MainDataSection.AppendChild(MainDataReTable);
        }
    }
}

Step7.利用Option事件,將重複表格讀取出來

if (e.Site.Value == "")
    return; 

XPathNavigator MainPath = MainDataSource.CreateNavigator();
XPathNodeIterator ParentXPath = MainPath.Select("/my:myFields/my:Group/my:Retable", NamespaceManager);
XPathNavigator RTF = MainPath.SelectSingleNode("/my:myFields/my:Data", NamespaceManager);
//清空
RTF.SetValue("");
string RTFData = string.Empty;
while (ParentXPath.MoveNext())
{
    string title = ParentXPath.Current.SelectSingleNode("my:Title",NamespaceManager).Value;
    string option = ParentXPath.Current.SelectSingleNode("my:Option",NamespaceManager).Value;
    if (option=="yes")
    {
        RTFData += "<div xmlns=\"http://www.w3.org/1999/xhtml\">" + title + "</div>";
    }
}
if (RTFData!="")
    RTF.InnerXml = RTFData;

Step8.上傳到Sharepoint看是否可執行

操縱畫面如下

範例下載:MultipleOption.rar

 

新手發帖請多包涵


回應

  • Harumi 2010/1/19 上午 02:39 回覆

    # re: [Infopath] 如何在 Form Service 使用多選 / How to use Multiple Optional in Form Service

    Hi 您好

    我是SharePoint MVP Harumi ~ 很高興認識您

    最近我也在研究這方面的東西,看完您的資料相當值得參考~

    但是有個問題想請教~您這篇文章中所Demo的是單一的清單資料,那如果說今天的情境是從清單中抓取多個欄位的資料~可能是一整個ROW Data ~ 或者說是從SQL中的資料表抓取一筆完整的紀錄(多個欄位資料)~~

    您認為應該如何修改比較好呢?

  • 余小章 2010/1/19 下午 12:22 回覆

    # re: [Infopath] 如何在 Form Service 使用多選 / How to use Multiple Optional in Form Service

    to Harumi :
    你好~我是歹命資深工讀生,很高興認識你!
    當Row數太多時,如果是我,我會畫出五個Repeat Table或是更多,來分散欄位資料顯示,必免資料欄位過長。

    至於幾個清單,在資料處理上沒有太大的問題,可以用DataTable搭配DataView。

     

  • Harumi 2010/1/25 上午 02:25 回覆

    # re: [Infopath] 如何在 Form Service 使用多選 / How to use Multiple Optional in Form Service

    to 余小章 :

    Hi 客氣啦~~呵呵~也好高興認識您~
    我試著修改了一下您的程式,不過還是失敗了~XD
    我目前是嘗試修改多增加一個欄位CountryName的欄位,您是否有空可以協助我做這段的修改呢?如果方便的話想與您在MSN上討論一下~^^~我的MAIL就是我的MSN帳號~

  • VB/ VBA/ C#/ Java/ C++ 語言學習筆記  2010/1/25 上午 11:59 回覆

    # re: [Infopath] 如何在 Form Service 使用多選 / How to use Multiple Optional in Form Service

    to Harumi :

    我看不到你的MAIL,不過歡迎加入我的MSN啦~Blog的左上角有"加入聯絡人"


*標 題:

*姓 名:

 電子郵件: (將不會被顯示)

 個人網頁:

*回應

登入後使用進階評論

Please add 7 and 7 and type the answer here: