在C# WinForms中,我有两个DataGrids显示表格数据。首先显示所有行,第二行显示这些行的过滤集。我需要在我的BindingList视图实例上构建过滤视图。更改基础列表后,需要更新此视图。
我尝试用LINQ构建新的BindingList实例,但是当底层myList被更改时,过滤的内容不会被更新。
var filtered = new BindingList<Clip>(myList.Where<Clip>
(
c => c.participant.Contains(id)
).ToList<Clip>());我该怎么做?谢谢
发布于 2019-04-18 15:09:15
BindingList<T>不支持过滤(至少不支持直接过滤),所以我建议用DataTable代替您的BindingList。DataView支持过滤,过滤后的数据只是同一个DataTable的自定义子集。
在本例中,两个BindingSource类用于将相同的DataTable绑定到两个DataGridView控件。
其中一个BindingSource类使用DataView.RowFilter属性绑定到DataTable的一个过滤的DataView.RowFilter,该属性是一个接受类SQL命令子集的表达式。
在这里,第二个DataGridView.DataSource被设置为将其DataSource链接到已过滤的DataView的BindingSource。
过滤器是使用第二列("Value A1")的一个特定值(Column1)定义的。
在可视化示例中可以看到,两个DataGridView控件在两个DataGridViews的单元格值发生更改时更新其单元格值。
另外,筛选器在第二个DataGridView上是活动的:当筛选的列值发生变化时,行被过滤。

若要测试此行为,请向表单中添加2个DataGridView控件,添加一个按钮(此处命名为btnBind),并使用DataGridView处理程序订阅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());
}
}https://stackoverflow.com/questions/55746869
复制相似问题