根据另一个DataGridView的行筛选BindingSource
本文关键字:筛选 BindingSource DataGridView 另一个 | 更新日期: 2023-09-27 17:57:42
我在Winforms中有两个DataGridViews
。DataGrid1连接到一个表,该表包含需要完成的作业列表。一旦有人完成了一项作业,它就会被输入到一个单独的表中作为完成,该表连接到DataGrid2。
我需要筛选DataGrid1的绑定源,这样当作业在DataGrid2中显示为已完成时,它就会从DataGrid1中筛选出来。我使用的当前代码只按DataGrid2中的最后一个条目过滤绑定源,我需要它按所有条目过滤。
如何根据DataGrid2列的所有值筛选DataGrid1的BindingSourc
e?
foreach (DataGridViewRow row in dataGrid2.Rows)
{
DataGrid1BindingSource.Filter =
string.Format("ColumnName <> '{0}'", row.Cells[1].Value);
}
以下是数据表中所有作业的示例,第一个网格包含未完成的作业,第二个网格包含已完成的作业。应显示在"未完成"网格中的作业是那些不在"已完成"作业网格中的工作:
__________ ____________ ___________
| All Jobs | | Incomplete | | Completed |
|――――――――――| |――――――――――――| |―――――――――――|
| JobTitle | | JobTitle | | JobTitle |
|――――――――――| |――――――――――――| |―――――――――――|
| Job 1 | | Job 1 | | Job 3 |
| Job 2 | | Job 2 | | Job 4 |
| Job 3 | | | | |
| Job 4 | | | | |
‾‾‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾‾‾
在阅读答案之前,您应该知道,如果您没有bool
字段或其他东西来检测完成了哪项工作,那就不是一个好的设计。你应该有一个单一的工作列表。然后,基于bool
字段,您应该在第一个网格中显示未完成的作业,在第二个网格中则显示已完成的作业。那么滤波器将简单地为Completed = true
和Completed = false
。
无论如何,您可以在过滤器表达式中使用IN
。创建一个要在过滤器中使用的值列表就足够了,然后以这种方式创建过滤器:
var ids = this.dataGridView2.Rows.Cast<DataGridViewRow>()
.Where(r => !r.IsNewRow)
.Select(r => r.Cells[0].Value.ToString());
bs1.Filter = string.Format("Column1 NOT IN ({0})", string.Join(",", ids));
在上面的例子中,我假设id是int
,所以例如"Column1 NOT IN (1,2,3)"
将是过滤器。对于字符串id,过滤器将为"Column1 NOT IN ('a','b','c')"
。因此,您可以更改select语句,如下所示:
.Select(r => string.Format("'{0}'",r.Cells[0].Value.ToString()));
这个片段很难看,但它应该给你一个提示:
var colname = YOURGRIDTOFILTER.Columns[INDEXOFCOLUMNTOFILTER].HeaderText;
var filterString = colname+" <> ";
foreach (DataGridViewRow row in dataGrid2.Rows)
{
filterString += "'" + row.Cells[1].Value + "' OR "+colname+" <> ";
}
filterString = filterString.Substring(0, filterString.LastIndexOf("OR"));