【问题标题】:Suppress or Cancel Filter on DataGridView edit在 DataGridView 编辑上抑制或取消过滤器
【发布时间】:2013-09-30 20:05:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net winforms datagridview


    【解决方案1】:

    您可以简单地在某些Refresh 方法中设置RowFilter,并且只在那时调用该方法。但是,您必须在一些适当的事件处理程序(例如 CellEndEdit 事件处理程序)中向 RowFilter 添加一些 or 条件,以防止当前行消失,无论用户输入什么值:

    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;
    }
    

    【讨论】:

      【解决方案2】:

      “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 的内容来使用 'Contains' 条件进行搜索(例如 RowFilter = '%valueA%')。

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多