DataGridView过滤器隐藏已编辑的项目

时间:2014-05-21 10:39:32

标签: c# .net winforms datagridview

我有一个绑定到DataTable的DataGridView。然后使用下面的代码在2列上过滤,但是当您编辑过滤列中的任何一个单元格然后单击另一行(或表单中的任何其他位置)时,编辑的行会​​因过滤器而消失。 / p>

string rowFilter = string.Format("[{0}] = '{1}'", "Assigned To", comboBoxDepartment.Text);
rowFilter += string.Format(" AND [{0}] = '{1}'", "Status", comboBoxCaseStatus.Text);
(dataGridViewCases.DataSource as DataTable).DefaultView.RowFilter = rowFilter;

如何在编辑其中一个已过滤的字段时阻止这种情况发生?

1 个答案:

答案 0 :(得分:1)

(我假设您有一个唯一的ID列)

您必须在任何方法之外声明过滤器。

string filter;

也声明这些:

int id;        
string nameOfcolumn;
string newValue;

按原样应用过滤器,但现在过滤器在方法之外声明。

在单元格DataGridView_CellParsing事件方法中,您可以在编辑后获取单元格的值,但是在应用过滤器之前得到它,在此事件方法中,您必须保存要修改的行的ID:

private void DataGridView_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
    {
    //Get the id, (assuming that the id is in the first column)
    id =int.Parse(DataGridView.Rows[e.RowIndex].Cells[0].Value.ToString());

    //If you need more comparison, you can get the name of the column and the new value of the cell too         
     nameOfcolumn = DataGridView.Columns[e.ColumnIndex].Name;
     newValue = e.Value.ToString();
    }

现在,在DataGridView_CellEndEdit事件方法中,您将修改过滤器并重新应用它。

private void DataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        filter += " OR id=" + id.ToString(); //The modified value is now being included on the filter



   //If you need more comparisons or if you can't use an id, you can use columnName and newValue        

   //filter += " OR (" + columnName + " LIKE '" + newValue+ "' AND id=" + id.ToString() + ")";


  //Re-apply it 
        (DataGridView.DataSource as DataTable).DefaultView.RowFilter=filter;  
  }

我从这个post中提出了这个想法,但是抱怨说第一个答案"还显示了该列的所有其他行具有相似的值",但是你解决了如果您使用该ID。