在C#WinForms中,我有两个显示表格数据的DataGrids。首先显示所有行,第二个显示这些行的过滤集。我需要在BindingList视图实例上构建过滤视图。一旦更改了基础列表,就需要更新此视图。
我已经尝试使用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绑定到两个DataGridView控件。 其中一个BindingSource类使用DataView.RowFilter属性绑定到DataTable的过滤DataView,Expression接受类似SQL的命令子集。
这里,第二个DataGridView.DataSource
设置为BindingSource,其DataSource链接到过滤的DataView
。
使用第二列("Value A1"
)的特定值(Column1
)定义过滤器。
您可以在可视化示例中看到两个DataGridView控件在更改两个DataGridViews的单元格值时更新其单元格值。 此外,过滤器在第二个DataGridView上处于活动状态:当过滤的列值更改时,将过滤行。
要测试此行为,请向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());
}
}