У меня есть DataGridView, привязанный к DataTable. Затем он фильтруется по 2 столбцам, используя приведенный ниже код, однако, когда вы редактируете одну из ячеек в отфильтрованных столбцах, а затем нажимаете на другую строку (или где-либо еще внутри формы), отредактированная строка исчезает из-за фильтра.
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;
Как я могу остановить это при редактировании одного из фильтрованных полей?
(Я предполагаю, что у вас есть столбец идентификатора, который является уникальным)
Вы должны объявить свой фильтр вне любого метода.
string filter;
объявите их тоже:
int id;
string nameOfcolumn;
string newValue;
Примените фильтр так, как вы это делали раньше, но теперь фильтр объявлен вне метода.
В методе событий ячейки DataGridView_CellParsing вы получаете значение ячейки после редактирования, но вы получаете ее до того, как фильтр будет применен, в этом методе события вы должны сохранить идентификатор изменяемой строки:
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;
}
Я воспринял эту идею с этой должности, но там жалуются, что первый ответ "показывает также все другие строки, которые имеют одинаковые значения для этого столбца", но вы решаете его, если используете идентификатор.