簡體   English   中英

在DataGridView上禁止或取消過濾器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM