根据另一个DataGridView的行过滤BindingSource

时间:2016-07-19 11:05:30

标签: c# winforms datagridview filter bindingsource

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

我需要过滤DataGrid1的绑定源,以便当一个作业在DataGrid2中显示为已完成时,它会从DataGrid1中过滤掉。当前代码I使用的只是通过DataGrid2中的最后一个条目过滤绑定源,我需要它按所有条目进行过滤。

如何根据DataGrid2的一列的所有值过滤DataGrid1的BindingSourc

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

2 个答案:

答案 0 :(得分:3)

在阅读答案之前,您应该知道如果您没有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(r => string.Format("'{0}'",r.Cells[0].Value.ToString()));

答案 1 :(得分:0)

这个片段非常难看,但它应该给你一些提示:

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