我有一个绑定到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;
如何在编辑其中一个已过滤的字段时阻止这种情况发生?
答案 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。