我希望能夠將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如何知道爲列表中的每個對象生成列? - 創建自定義類型描述符?這似乎是矯枉過正。
但我覺得解決方案應該非常簡單和容易。我在這裏錯過了什麼基礎?
也許DataTable過度殺傷,但它做你需要它做。如果你不需要編輯,那麼DataGrid也是矯枉過正的。 – Paparazzi
@Blam我可以使用ListView,還是更簡單? –
對於多列,然後是ListView GridView。它沒有AutoGenerateColumns,但它更輕量。我的觀點是DataGrid比DataTable的開銷更大。我所做的是一個帶有列集合的結構,然後在後面的代碼中手動構建列。 – Paparazzi