2013-09-30 2 views
0

У меня есть DataGridView, который позволяет редактировать (ReadOnly = false). DataGridView также может иметь один или несколько фильтров, связанных с его источником данных. Например:Отменить или отменить фильтр в DataGridView edit

(myDataGridView.DataSource as DataTable).DefaultView.RowFilter = "[myColumn] = 'value'"; 

Если фильтр применяется, и пользователь редактирует поле в MyColumn, строка немедленно «исчезает», так как он больше не выполняет критерии фильтра. Есть ли способ подавить или отменить это действие? В идеале я хочу, чтобы пользователь «обновил» сетку, чтобы фильтр был повторно применен по желанию.

ответ

0

Вы можете просто установить RowFilter в некотором Refresh методе и только вызвать этот метод в это время. Однако вы должны добавить некоторые or условия к RowFilter в некоторых соответствующем обработчике событий, такие как обработчик CellEndEdit события, чтобы сохранить текущую строку из не будучи исчезло независимо от того, какого значения введенного пользователя:

string baseFilter = "[myColumn] = 'value'"; 
//CellEndEdit event handler for your myDataGridView 
private void myDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e){ 
    (myDataGridView.DataSource as DataTable).DefaultView.RowFilter = baseFilter + " OR [myColumn] = '" + myDataGridView[e.ColumnIndex,e.RowIndex].Value + "'"; 
} 
//you can call this method such as in some Click event handler of some Refresh Button 
public void RefreshGrid(){ 
    (myDataGridView.DataSource as DataTable).DefaultView.RowFilter = baseFilter; 
} 
0

The mehod высказанного ' King King 'не так хорош, потому что он вызывает отображение всех других строк, которые имеют одинаковые значения для этого столбца.

У вас есть возможность избежать использования механизма автофильтра DataTable.DefaultView.RowFilter и вместо этого выполнить цикл по всем строкам вашего DataGridView и проверить свой фильтр filteringcriteria, чтобы установить каждую строку Visible.

void applyFilter() 
    { 
     foreach (DataGridViewRow row in grid1.Rows) 
     { 
      string columnA = row.Cells["ColumnA"].Value as string; 
      string columnB = row.Cells["ColumnB"].Value as string; 
      row.Visible = (columnA == "valueA" && columnB == "valueB"); 
     } 
    } 

вы также можете использовать что-то вроде как: columnA.IndexOf("valueA", StringComparison.OrdinalIgnoreCase) > -1 искать с 'Содержит' критерии (например, в качестве RowFilter = '%valueA%').

Смежные вопросы