过滤绑定列表

时间:2019-04-18 13:16:54

标签: c# winforms filter bindinglist

在C#WinForms中,我有两个显示表格数据的DataGrid。首先显示所有行,第二个应该显示这些行的过滤后的集合。我需要在BindingList视图实例上构建过滤视图。更改基础列表后,需要更新此视图。

我试图用LINQ和Where建立新的BindingList实例 但是当基础myList更改时,过滤器不会更新。

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

我该怎么做? 谢谢

1 个答案:

答案 0 :(得分:2)

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

在示例中,使用两个BindingSource类将相同的DataTable绑定到两个DataGridView控件。
BindingSource类之一使用DataView.RowFilter属性绑定到DataTable的已过滤DataView,Expression属性接受类似SQL的命令的子集。

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

您可以在可视示例中看到,两个DataGridView的单元格值都更改时,两个DataGridView控件会更新其单元格值。
同样,该过滤器在第二个DataGridView上处于活动状态:当过滤的Column(s)值更改时,将对行进行过滤。

DataGridView filtered BindingSource

要测试此行为,请向表单中添加2个DataGridView控件,添加一个按钮(此处名为btnBind),并使用 Click订阅btnBind_Click事件< / strong>处理程序。

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());
    }
}