过滤BindingList

问题描述 投票:0回答:1

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

我已经尝试使用LINQ和Where构建新的BindingList实例,但是当更改基础myList时,不会更新已过滤的实例。

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

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

c# winforms filter bindinglist
1个回答
2
投票

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

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

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

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

DataGridView filtered BindingSource

要测试此行为,请向Form添加2个DataGridView控件,添加一个Button(此处名为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());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.