根据另一个DataGridView的行筛选BindingSource

本文关键字:筛选 BindingSource DataGridView 另一个 | 更新日期: 2023-09-27 17:57:42

我在Winforms中有两个DataGridViews。DataGrid1连接到一个表,该表包含需要完成的作业列表。一旦有人完成了一项作业,它就会被输入到一个单独的表中作为完成,该表连接到DataGrid2。

我需要筛选DataGrid1的绑定源,这样当作业在DataGrid2中显示为已完成时,它就会从DataGrid1中筛选出来。我使用的当前代码只按DataGrid2中的最后一个条目过滤绑定源,我需要它按所有条目过滤。

如何根据DataGrid2列的所有值筛选DataGrid1的BindingSource?

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    |      |            |      |           |
 ‾‾‾‾‾‾‾‾‾‾        ‾‾‾‾‾‾‾‾‾‾‾‾        ‾‾‾‾‾‾‾‾‾‾‾

根据另一个DataGridView的行筛选BindingSource

在阅读答案之前,您应该知道,如果您没有bool字段或其他东西来检测完成了哪项工作,那就不是一个好的设计。你应该有一个单一的工作列表。然后,基于bool字段,您应该在第一个网格中显示未完成的作业,在第二个网格中则显示已完成的作业。那么滤波器将简单地为Completed = trueCompleted = 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"));