0

我有允许编辑的 DataGridView (ReadOnly = false)。DataGridView 也可能有一个或多个与其数据源关联的过滤器。例如:

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

如果应用了过滤器,并且用户编辑了 myColumn 中的字段,则该行将立即“消失”,因为它不再满足过滤器的条件。有没有办法抑制或取消此操作?理想情况下,我希望用户“刷新”网格,以便随意重新应用过滤器。

4

2 回答 2

0

'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");
        }
    }

您也可以使用类似 as:的内容columnA.IndexOf("valueA", StringComparison.OrdinalIgnoreCase) > -1来搜索“包含”条件(例如 as RowFilter = '%valueA%')。

于 2013-10-09T06:01:30.257 回答
0

您可以简单地RowFilter在某个Refresh方法中设置,并且只在那时调用该方法。但是,无论用户输入什么值,您都必须在一些适当的事件处理程序(例如事件处理程序)中添加一些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;
}
于 2013-10-01T06:10:39.317 回答