过滤的BindingList(Filtering BindingList)

2019-10-29 14:36发布

在C#中的WinForms我有两个DataGrid中显示表格数据。 第一显示器中的所有行,第二个应该显示过滤的这些行的。 我需要建立在我的BindingList视图实例过滤视图。 这种观点需要更新,一旦底层的名单发生变化。

我试着LINQ和在哪里建立新的BindingList实例,但在过滤时根本myList中改变时它不会更新。

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

我怎样才能做到这一点? 谢谢

Answer 1:

BindingList<T>不支持过滤(不是直接的,至少),所以我提出具有一个DataTable为了代替你的BindingList。 数据视图支持筛选和经滤波的数据是一样的数据表的一个自定义的子集。

在该示例中,两个BindingSource的类是使用到相同的数据表结合两种DataGridView的控件。
一个BindingSource的类被绑定到DataTable的经滤波的数据视图,使用DataView.RowFilter属性,一个表达其接受类似SQL命令的子集。

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

您可以在视觉样本中看到,当细胞的两个DataGridViews的值改变两个DataGridView控件更新单元格的值。
此外,过滤器是在第二的DataGridView活性:当所述过滤柱(一个或多个)值变化的行进行过滤。

为了验证这一行为,加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());
    }
}


文章来源: Filtering BindingList