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绑定到DataSet的DataGridView?的详细内容。更多信息请关注PHP中文网其他相关文章!