c# - 过滤绑定(bind)列表

标签 c# winforms filter bindinglist

在 C# WinForms 中,我有两个显示表格数据的 DataGrid。第一个显示所有行,第二个应该显示这些行的过滤集。我需要在 BindingList View 实例上构建过滤 View 。一旦基础列表发生更改,就需要更新此 View 。

我尝试使用 LINQ 和Where 构建新的BindingList 实例 但当底层 myList 更改时,过滤的内容不会更新。

var filtered = new BindingList<Clip>(myList.Where<Clip>
(
c => c.participant.Contains(id)
).ToList<Clip>());

我该怎么做? 谢谢

最佳答案

BindingList<T>不支持过滤(至少不直接支持),所以我建议用 DataTable 替换 BindingList。 DataView支持过滤,过滤后的数据只是同一个DataTable的自定义子集。

在示例中,两个 BindingSource类用于将相同的 DataTable 绑定(bind)到两个 DataGridView 控件。
BindingSource 类之一绑定(bind)到 DataTable 的经过筛选的 DataView,使用 DataView.RowFilter属性(property),一个Expression它接受类似 SQL 命令的子集。

这里是第二个 DataGridView.DataSource设置为 BindingSource,其 DataSource 链接到已过滤的 DataView .
该过滤器是使用第二列 ( "Value A1" ) 的特定值 ( Column1 ) 定义的。

您可以在可视化示例中看到,当两个 DataGridView 的单元格值发生更改时,两个 DataGridView 控件都会更新其单元格值。
此外,过滤器在第二个 DataGridView 上处于事件状态:当过滤的列值更改时,将过滤行。

DataGridView filtered BindingSource

要测试此行为,请将 2 个 DataGridView 控件添加到表单,添加一个按钮(此处名为 btnBind )并订阅 Click事件与 btnBind_Click 处理程序。

private BindingSource dgvBindingSource1 = null;
private BindingSource dgvBindingSource2 = null;
private DataTable dt = null;

private void btnBind_Click(object sender, EventArgs e)
{
    FillData(3, 3);
    dgvBindingSource1 = new BindingSource(dt, null);

    DataView dv = dt.AsDataView();
    dv.RowFilter = "Column1 = 'Value A1'";
    dgvBindingSource2 = new BindingSource(dv, null);

    dataGridView1.DataSource = dgvBindingSource1;
    dataGridView2.DataSource = dgvBindingSource2;
}

private void FillData(int cols, int rows)
{
    dt = new DataTable("TestTable");
    dt.Columns.AddRange(Enumerable.Range(0, cols)
              .Select(i => new DataColumn("Column" + i.ToString(), typeof(string))).ToArray());

    for (int r = 0; r < rows; r++) {
        dt.Rows.Add(Enumerable.Range(0, cols)
               .Select(n => $"Value {(char)('A' + r)}" + n.ToString()).ToArray());
    }
}

关于c# - 过滤绑定(bind)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55746869/

相关文章:

c# - 使用 Motorola Emdks 调整天线范围

c# - 在 C# 中从 DataRow[] 中删除行

c# - Presenter 是否在 MVP 模式中执行 GUI 逻辑?

javascript - 过滤 <td> 元素中带有空格的匹配文本

php - Laravel,在filter中调用filter

python - 在 Python 中通过 Scipy 创建带通滤波器?

C# 如何: listening if new record is inserted in a mysql table

c# - 在 asp.net 中将 javascript 添加到页脚的“最简洁”方式

c# - 在 C# 中使用 Windows 窗体隐藏/阻止选项卡

c# - 捕获鼠标在窗体上的任意位置单击(没有 IMessageFilter)