在 C# WinForms 中,我有两个显示表格数据的 DataGrid。第一个显示所有行,第二个应该显示这些行的过滤集。我需要在 BindingList View 实例上构建过滤 View 。一旦基础列表发生更改,就需要更新此 View 。
我尝试使用 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 绑定(bind)到两个 DataGridView 控件。
BindingSource 类之一绑定(bind)到 DataTable 的经过筛选的 DataView,使用 DataView.RowFilter属性(property),一个Expression它接受类似 SQL 命令的子集。
这里是第二个 DataGridView.DataSource
设置为 BindingSource,其 DataSource 链接到已过滤的 DataView
.
该过滤器是使用第二列 ( "Value A1"
) 的特定值 ( Column1
) 定义的。
您可以在可视化示例中看到,当两个 DataGridView 的单元格值发生更改时,两个 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());
}
}
关于c# - 过滤绑定(bind)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55746869/