DataGridView 數據操作:高效過濾方法
在不修改 DataGridView 底層數據源的情況下過濾 DataGridView 中顯示的數據,有多種方法可供選擇,具體方法取決於數據源類型。雖然直接過濾 DataTable 通過其默認視圖非常簡單,但通過 DataMember 綁定到 DataSet 的 DataTable 的過濾則更具挑戰性。
場景一:直接過濾 DataTable
當 DataGridView 的 DataSource 直接設置為 DataTable 時,可以通過修改 DataTable 的 DefaultView.RowFilter 屬性來實現過濾。此方法有效是因為 DataTable 直接綁定到 DataGridView,允許直接操作其數據。
場景二:過濾綁定到 BindingSource 的 DataTable
如果 DataGridView 的 DataSource 是一個 BindingSource,並且 BindingSource 的 DataSource 是 DataTable,則可以通過修改 BindingSource.Filter 屬性來執行過濾。此方法有效是因為 BindingSource 充當 DataTable 和 DataGridView 之間的中間體,允許在不修改 DataTable 本身的情況下進行過濾。
場景三:通過 DataMember 將 DataTable 綁定到 DataSet
當 DataGridView 的 DataSource 是一個 DataSet,並且 DataMember 設置為 DataTable 名稱時,過濾變得更加複雜。關鍵區別在於 DataGridView 不是直接綁定到 DataTable,而是綁定到 DataSet 中的 DataTable。
場景三中過濾失敗的原因
在這種情況下,嘗試過濾 ds.Tables[0].DefaultView.RowFilter
不會更新 DataGridView,因為 DataGridView 沒有直接綁定到 DataTable。它綁定到 DataSet 和 DataMember。修改 DataTable 的 DefaultView 不會反映在 DataGridView 中,因為 DataGridView 沒有意識到更改。
解決方案:過濾 DataView 並將其綁定到 DataGridView
為了解決這個問題,基於 DataTable 創建一個 DataView,將過濾器應用於 DataView,並將 DataGridView 的 DataSource 設置為 DataView。這種方法保留了原始 DataSet,並允許在不更改 DataGridView 的 DataSource 的情況下進行過濾。
代碼示例
<code class="language-csharp">private void textBox1_TextChanged(object sender, EventArgs e) { DataView dv = ds.Tables[0].DefaultView; dv.RowFilter = string.Format("Field = '{0}'", textBoxFilter.Text); dataGridViewFields.DataSource = dv; }</code>
以上是如何通過DataMember有效地過濾數據集的數據集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!