[英]Suppress or Cancel Filter on DataGridView edit
我有允許編輯的DataGridView(ReadOnly = false)。 DataGridView也可能具有一個或多個與其數據源關聯的過濾器。 例如:
(myDataGridView.DataSource as DataTable).DefaultView.RowFilter = "[myColumn] = 'value'";
如果應用了過濾器,並且用戶編輯了myColumn中的字段,則該行將立即“消失”,因為它不再滿足過濾器的條件。 有沒有辦法抑制或取消此操作? 理想情況下,我希望用戶“刷新”網格,以便隨意重新應用過濾器。
您可以僅在某些Refresh
方法中設置RowFilter
,然后僅在該時間調用該方法。 然而,你必須添加一些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;
}
“ King King”所說的方法不太好,因為它還會顯示該列具有相似值的所有其他行。
您可以選擇避免使用DataTable.DefaultView.RowFilter
自動過濾器機制,而是對DataGridView的所有行執行循環,並檢查過濾條件以設置每行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%'
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.