2013-09-30 136 views
0

我有DataGridView允許編輯(ReadOnly = false)。 DataGridView也可能有一個或多個與其數據源關聯的過濾器。例如:抑制或取消在DataGridView上的過濾器編輯

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

如果過濾器被應用,用戶編輯myColumn領域,該行立即「消失」,因爲它不再滿足過濾器的條件。有沒有辦法抑制或取消這一行動?理想情況下,我希望用戶「刷新」網格,以便過濾器可以隨意重新應用。

回答

0

您可以簡單地在Refresh方法中設置RowFilter並且只在該時間調用該方法。然而,你必須以某種適當的事件處理程序中添加一些or條件的RowFilterCellEndEdit事件處理程序,以保持當前行被消失無論用戶輸入什麼樣的價值:

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

由「中規定的mehod 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%')。