C# 根据另一个DataGridView的行筛选BindingSource

C# 根据另一个DataGridView的行筛选BindingSource,c#,winforms,datagridview,filter,bindingsource,C#,Winforms,Datagridview,Filter,Bindingsource,我在Winforms中有两个DataGridView。DataGrid1连接到一个表,该表包含需要完成的作业列表。一旦有人完成了一个作业,它就会作为completed输入到一个单独的表中,该表连接到DataGrid2 我需要过滤DataGrid1的绑定源,这样当一个作业在DataGrid2中显示为已完成时,它就会从DataGrid1中过滤出来。我使用的当前代码只按DataGrid2中的最后一个条目过滤绑定源,我需要它按所有条目过滤 如何根据DataGrid2列的所有值过滤DataGrid1的Bi

我在Winforms中有两个
DataGridView
。DataGrid1连接到一个表,该表包含需要完成的作业列表。一旦有人完成了一个作业,它就会作为completed输入到一个单独的表中,该表连接到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);
}

在阅读答案之前,你应该知道如果你没有一个
bool
字段或什么东西来检测完成了哪项工作,那么这不是一个好的设计。你应该有一个单一的工作列表。然后根据
bool
字段,您应该在第一个网格中显示未完成的作业,在第二个网格中显示已完成的作业。然后过滤器将简单地设置为
Completed=true
Completed=false

无论如何,您可以在过滤器表达式中使用
。创建要在筛选器中使用的值列表就足够了,然后按以下方式创建筛选器:

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));

这段代码相当难看,但它应该给你一个提示,告诉你该怎么做:

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"));
var colname=YOURGRIDTOFILTER.Columns[INDEXOFCOLUMNTOFILTER].HeaderText;
var filterString=colname+“”;
foreach(dataGrid2.Rows中的DataGridViewRow行)
{
filterString+=“'”+行。单元格[1]。值+“'或“+colname+”;
}
filterString=filterString.Substring(0,filterString.LastIndexOf(“或”);

什么技术?WinForms?网络表单?WPF?银灯?ASP.NET MVC?我使用的是Winforms。@克里斯松格不清楚你在问什么。请改写问题并对其进行更多描述,同时显示初始状态下的grid1和grid2示例,并说明过滤器的结果。由于您在那里循环,因此您在每个循环步骤中都会覆盖上一个过滤器条件。因此,只有网格2中的最后一行应用于filter@ChrisSonger如果你没有一个布尔字段或什么东西来检测哪项工作完成了,那就是一个糟糕的设计。你应该有一个单一的工作列表。然后基于布尔字段,您应该在网格1中显示未完成的作业,在网格2中显示已完成的作业。然后这个过滤器将是completed=true,ad completed=false。实际上,我正试图将这两个表相互比较,所以Grid1有一个作业列表,Grid2有一个已完成的作业列表,每个作业都有自己的绑定源。我正试图这样做,当一个作业被输入到完成的作业网格2中时,它会从网格1中的作业列表中过滤出来。Pay attention值列表是从网格2中创建的,然后是分配给网格1的过滤器。这样,网格2中的那些行将不会显示在网格1中,只有其他行会显示在网格1中。我现在得到语法错误:“JobTitle”运算符后缺少操作数。工作的标题有一个空格。我在其他应用程序中使用了带有完整真/假字段的设计。我在这里不使用它的原因是,需要完成的作业列表不会改变。一旦包含作业的列表的行数为零,过滤器将被删除,用户将重新开始完整的列表。我假设字段类型为
int
。对于字符串类型,我发布了一个示例。顺便说一句,您可以通过单击答案附近的复选标记来接受答案。另外,当你接受一个答案时,如果你也通过点击帖子附近的向上箭头来投票,那就太好了。这一点也不复杂,但它是普通的、合理的和推荐的。有关接受答案如何工作的更多信息,请参见此。
.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"));