2013-12-11 81 views
1

我希望能夠將SQL輸入到文本框中並將結果顯示在WPF數據網格中。我想先從一個SqlDataReader,並設置DataGrid的ItemsSource到數據讀取器:將數據網格綁定到數據讀取器

using (var cmd = conn.CreateCommand()) { 
    cmd.CommandText = sql.Text; 
    sqlResults.ItemsSource = cmd.ExecuteReader(); 
} 

但這種失敗,出現以下錯誤:Invalid attempt to call FieldCount when reader is closed,我理解的意思,到時候WPF得到周圍閱讀FieldCount行對象的屬性,using塊已經退出。

所以我嘗試使用LINQ和ToList,要得到的東西,會在內存中堅持:

sqlResults.ItemsSource = cmd.ExecuteReader().Cast<DbDataRecord>().ToList(); 

但這只是顯示每一行,這顯然是其DbDataRecord具有唯一屬性「字段計數」。

一些解決方案,我已經考慮:

  • 綁定到數據表,而不是一個DataReader?但我不需要編輯功能。
  • 選擇每一行到內存中的數據結構?我可以使用什麼數據結構?我不能使用匿名類型,因爲列的名稱和類型會根據SQL語句進行更改。如果我使用List<object>,那麼datagrid如何知道爲列表中的每個對象生成列?
  • 創建自定義類型描述符?這似乎是矯枉過正。

但我覺得解決方案應該非常簡單和容易。我在這裏錯過了什麼基礎?

+0

也許DataTable過度殺傷,但它做你需要它做。如果你不需要編輯,那麼DataGrid也是矯枉過正的。 – Paparazzi

+0

@Blam我可以使用ListView,還是更簡單? –

+0

對於多列,然後是ListView GridView。它沒有AutoGenerateColumns,但它更輕量。我的觀點是DataGrid比DataTable的開銷更大。我所做的是一個帶有列集合的結構,然後在後面的代碼中手動構建列。 – Paparazzi

回答

1

也許DataTable過度殺傷,但它做你需要做的事情。

0

嗯,從你說過的話,我可能會去找一個包含與DB列匹配的屬性的結構,然後用linq填充它,這樣你就可以很容易地綁定它。

工作多與JavaScript和不知道如果你能找到一個相當於的eval(這是從來沒有建議由創作者,順便說一句:)被使用,如果這將有助於...

+1

1)正如我在問題中提到的,我正在使用任意的SQL語句,所以我不知道傳入數據的字段和數據類型。我會將它映射到什麼樣的結構? 2)我怎麼可能在這裏使用'eval'? –

+0

2)Eval來自JavaScript。這在這裏沒用。 1)一定是錯過了......那會讓你感到反思和很多骯髒的工作...可能應該刪除我的答案,並等待Skeet彈出(你應該在牀上......在以色列的時間已晚: )) – Noctis

+0

Brendan Eich建議避免使用'eval'?你有這方面的來源嗎? –