[C#.NET][Infopath 2007] 如何使用程式加入列至重複表格 / How to Add Row to a Repeat Table(1)

[C#.NET][Infopath 2007] 如何使用程式加入列至重複表格 / How to Add Row to a Repeat Table(1)

首先建立好資料格式,如下圖

2009-12-4 上午 01-15-02

 

再把它拖拉到Infopath表單,然後新增一個按鈕,如下圖

2009-12-4 上午 01-18-23

然後在按鈕事件加入以下程式碼

XPathNavigator xPathNavi = MainDataSource.CreateNavigator();
XPathNavigator details = xPathNavi.SelectSingleNode("/my:myFields/my:fileds", NamespaceManager);
XPathNavigator repTable = details.SelectSingleNode("/my:myFields/my:fileds/my:repeat", NamespaceManager);
for (int i = 0; i < 6; i++)
{
    repTable.SelectSingleNode("my:F1", NamespaceManager).SetValue("F1-" + counter.ToString());
    repTable.SelectSingleNode("my:F2", NamespaceManager).SetValue("F2-" + counter.ToString());
    repTable.SelectSingleNode("my:F3", NamespaceManager).SetValue("F3-" + counter.ToString());
    details.AppendChild(repTable);
    counter++; 
}
然後執行按鈕程式發現多了一筆資料,似乎在第一次插入項目時都會發生這狀況

2009-12-4 上午 01-22-38

 

 

再多按幾次就發現,資料顯示怪怪的,原來是第一筆資料一直變

2009-12-4 上午 01-32-36

 

 

 

 

為了應付此現象,我們必須動手再處理一下

//程式第一次執行時,刪除特殊的第一列,並記錄真正的第一筆資料
if (FirstRun == false)
{
    XPathNodeIterator rows = details.Select("my:repeat", NamespaceManager);
    XPathNavigator first = details.SelectSingleNode("my:repeat[1]", NamespaceManager);
    XPathNavigator second = details.SelectSingleNode("my:repeat[" + Convert.ToString(rows.Count - counter) + "]", NamespaceManager);
    //first.DeleteRange(second);
    second.DeleteSelf();
    //按鈕已被執行過一次以上,包含一次
    FirstRun = true;
    //記錄第一筆資料
    first = details.SelectSingleNode("my:repeat[1]", NamespaceManager);
    f1 = first.SelectSingleNode("my:F1", NamespaceManager).Value;
    f2 = first.SelectSingleNode("my:F2", NamespaceManager).Value;
    f3 = first.SelectSingleNode("my:F3", NamespaceManager).Value;
}
//當按鈕按下第二次時,寫回剛剛記錄的第一筆資料
if (FirstRun == true)
{
    XPathNodeIterator rows1 = details.Select("my:repeat", NamespaceManager);
    XPathNavigator first1 = details.SelectSingleNode("my:repeat[1]", NamespaceManager);
    first1.SelectSingleNode("my:F1", NamespaceManager).SetValue(f1);
    first1.SelectSingleNode("my:F2", NamespaceManager).SetValue(f2);
    first1.SelectSingleNode("my:F3", NamespaceManager).SetValue(f3);
}
果然處理掉了剛剛發生的狀況,沒有被多插,第一筆資料也還存在
2009-12-4 上午 01-37-16 
範例下載:
AddRowToRepeatTable.rar

 

 

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo