2012-09-16 21 views
0

我想從xml文件中獲取數據,然後使用datatable.Select()過濾以在ComboBox中添加值。嘗試使用datatable.select獲取不同的值

但我得到重複值,所以我需要應用DISTINCT排序。試過dt1.DefaultView.ToTable但沒有運氣。仍然在組合框中添加重複的項目。下面是我使用的代碼片段:

DataTable dt1 = XMLCategory.ds.Tables["AgencyInfo"]; 

DataRow[] foundRows; 
foundRows = dt1.Select("AgencyRegion='" + cmbAgPr_Region.Text + "'"); 
DataTable dt2 = dt1.DefaultView.ToTable(true, "AgencyMarket"); 
for (int i = 0; i < foundRows.Length; i++) 
{ 
    cmbAgPr_Market.Items.Add(foundRows[i][1]); 
} 

任何幫助..

+0

你爲什麼不直接讀取Xml和綁定到組合框,而不是通過數據表? –

+0

,因爲我必須根據第一列值過濾數據,並且我需要第二列數據在過濾器後填充到組合框中。請讓我知道是否有更好的選擇。 – Imran

+0

你得到重複在哪個字段? –

回答

1

您可以使用LINQ與GroupBy得到明顯。下面的示例代碼假設你需要在列「列名」不同與string類型:

var foundRows = dataTable.Select("...") 
        .GroupBy(row => row.Field<string>("columnName"), 
          (key, group) => group.First()) 
        .ToArray(); 
+0

工作完美,這將解決我的一些更多的問題。感謝Cuong和LINQ。 – Imran

0

編輯:小穿幫固定。

您應該使用dt2中的行填充列表框,而不是dt1。您的ToTable返回到dt2,但foundRows來自dt1。這應該解決問題,如下所示。

DataRow[] distinctRows = dt2.Select(); 
for (int i=0; i < distinctRows.Length; i++) 
{ 
    cmbAgPr_Market.Items.Add(distinctRows[i][1]); 
} 

只是爲了完整起見,你可以在distinctRows行的foreach在作爲替代的結構:

foreach(Row currentRow in distinctRows) 
{ 
    cmbAgPr_Market.Items.Add(currentRow[1]); 
} 
+0

上面的代碼在dt2.rows上發生錯誤,因爲這是一個DataRowCollection,錯誤是「不能隱式地將類型'System.Data.DataRowCollection'轉換爲'System.Data.DataRow []'」。沒有辦法爲數據行分配數據表值。 – Imran

+0

一秒鐘,將修復... –

+0

好吧,我的愚蠢愚蠢...只需要打電話在dt2上選擇,而不是引用行屬性。對於那個很抱歉!! –

相關問題