2014-09-24 42 views
0

我正在嘗試取DataSet並將每個項目添加到ComboBox使用LINQ將數據集轉換爲組合框項目

我目前使用foreach循環,就像這樣:

foreach (DataRow row in ds.Tables[0].Rows) 
{ 
    cmbCauseForRepair.Items.Add(row[0].ToString() + ":" + row[1].ToString()); 
} 

我想做到這一點使用LINQ。

這裏是我嘗試:

 cmbCauseForRepair.Items.Add(from r in ds.Tables[0].Rows.Cast<DataRow>() 
           select r[0] + ":" + r[1]); 

但是,我ComboBox只有1項: 「System.Linq.Enumerable」。

+0

'AddRange' ..? – 2014-09-24 17:49:17

+0

所有當前的答案都不涉及真正的問題。真正的問題。通過使用添加範圍我現在有12個項目說System.Linq.Enumerable。 #lovethedownvote – DidIReallyWriteThat 2014-09-25 16:30:32

+0

你是怎麼使用'AddRange'的? – 2014-09-25 17:11:46

回答

1

LINQ不遍歷記錄爲您服務。你仍然需要這樣做。

如果cmbCauseForRepair.Items.Add()有一個接受枚舉值的重載,那麼你就不需要了。但事實並非如此。它只接受an object。根據該文檔,該對象將被視爲:

項目的直觀表示顯示在組合框中。此內容表示由DisplayMember屬性指定。如果DisplayMember屬性爲null,則調用項目的ToString方法以獲取組合框中顯示的字符串;否則,顯示由DisplayMember屬性指定的存儲對象的屬性。

自從被傳遞到Add()的對象是IEnumerable<string>型,則它的.ToString()表示爲:

`IEnumerable<string>` 

基本上,你需要遍歷你的對象,將其添加一次一個:

var items = from r in ds.Tables[0].Rows.Cast<DataRow>() 
      select r[0] + ":" + r[1]; 
foreach (var item in items) 
    cmbCauseForRepair.Items.Add(item); 

或者使用a different method添加它們:

cmbCauseForRepair.Items.AddRange(from r in ds.Tables[0].Rows.Cast<DataRow>() 
           select r[0] + ":" + r[1]); 
+0

我upvoted並接受你的回答,但是不添加簡單的謝謝。 – DidIReallyWriteThat 2014-11-24 21:08:44

1

.Add()只增加一個項目。

嘗試同樣的方法,但使用.AddRange(),這增加了Object個收集到ComboBox

cmbCauseForRepair.Items.AddRange(from r in ds.Tables[0].Rows.Cast<DataRow>() 
           select r[0] + ":" + r[1]); 
0

最好使用string.Format而不是串聯串

cmbCauseForRepair.Items.AddRange(ds.Tables[0].Rows.Cast<DataRow>().Select(p => string.Format("{0}:{1}", p[0], p[1])).ToArray());