Фильтр DataGridView скрывает отредактированные элементы

1

У меня есть 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;

Как я могу остановить это при редактировании одного из фильтрованных полей?

Теги:
winforms
datagridview

1 ответ

1
Лучший ответ

(Я предполагаю, что у вас есть столбец идентификатора, который является уникальным)

Вы должны объявить свой фильтр вне любого метода.

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;  
  }

Я воспринял эту идею с этой должности, но там жалуются, что первый ответ "показывает также все другие строки, которые имеют одинаковые значения для этого столбца", но вы решаете его, если используете идентификатор.

  • 0
    Благодаря нескольким правкам это было именно то, что мне было нужно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню