You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ComboBox过滤DataGrid的Stats列时过滤异常问题求助

DataGrid Stats列多条件过滤失效问题

我尝试对DataGrid的Stats列进行过滤,该列包含“有效”“停用”“申请采购”三类数据。单独选择其中一类时过滤功能正常,但无法同时对这三类数据进行过滤,多选时无过滤效果。相关代码如下:

private void combo_SelectedIndexChanged(object sender, EventArgs e)
{           
    if (combo.SelectedIndex == 1) ;
    DataView pp = (dtgridreagentes.DataSource as DataTable).DefaultView;
    pp.RowFilter = string.Format("Stats = '{0}'", "Válido");

    if (combo.SelectedIndex == 2) ;
    DataView rr = (dtgridreagentes.DataSource as DataTable).DefaultView;
    rr.RowFilter = string.Format("Stats = '{0}'", "Fora de uso");

    if (combo.SelectedIndex == 3) ;
    DataView tt = (dtgridreagentes.DataSource as DataTable).DefaultView;
    tt.RowFilter = string.Format("Stats = '{0}'", "Solicitar compra");
}

问题分析

  1. if语句完全失效:每个if后面多了分号,导致条件判断根本不起作用——不管当前选中索引是什么,三个RowFilter赋值语句都会依次执行,最终只会保留最后一个过滤条件,单选时看似正常只是巧合。
  2. 控件不支持多选:原控件是单选ComboBox,本身就没法同时选中多个选项,自然实现不了多条件过滤。

修复方案

先修复单选逻辑的bug

把if后面的分号去掉,让代码块归属于条件判断,同时复用同一个DataView对象:

private void combo_SelectedIndexChanged(object sender, EventArgs e)
{           
    DataView dv = (dtgridreagentes.DataSource as DataTable).DefaultView;
    if (combo.SelectedIndex == 1)
    {
        dv.RowFilter = "Stats = 'Válido'";
    }
    else if (combo.SelectedIndex == 2)
    {
        dv.RowFilter = "Stats = 'Fora de uso'";
    }
    else if (combo.SelectedIndex == 3)
    {
        dv.RowFilter = "Stats = 'Solicitar compra'";
    }
    else
    {
        // 选中默认项时取消过滤
        dv.RowFilter = string.Empty;
    }
}

实现多选过滤功能

要同时选多个条件,得换成支持多选的控件,比如CheckedListBox:

  1. 在界面上添加CheckedListBox,命名为chkStatsFilter,添加三个选项:"Válido"、"Fora de uso"、"Solicitar compra"。
  2. 绑定ItemCheck事件,代码如下:
private void chkStatsFilter_ItemCheck(object sender, ItemCheckEventArgs e)
{
    DataTable dt = dtgridreagentes.DataSource as DataTable;
    if (dt == null) return;

    DataView dv = dt.DefaultView;
    List<string> selectedStates = new List<string>();

    // 收集已选中的项
    foreach (int index in chkStatsFilter.CheckedIndices)
    {
        selectedStates.Add(chkStatsFilter.Items[index].ToString());
    }
    // 补上刚修改的项(ItemCheck触发时,CheckedIndices还没更新)
    if (e.NewValue == CheckState.Checked)
    {
        selectedStates.Add(chkStatsFilter.Items[e.Index].ToString());
    }
    else
    {
        selectedStates.Remove(chkStatsFilter.Items[e.Index].ToString());
    }

    if (selectedStates.Count == 0)
    {
        // 没选中任何项时取消过滤
        dv.RowFilter = string.Empty;
    }
    else
    {
        // 用OR拼接多条件,同时转义单引号避免语法错误
        string filterStr = string.Join(" OR ", selectedStates.Select(s => $"Stats = '{s.Replace("'", "''")}'"));
        dv.RowFilter = filterStr;
    }
}

注意点

  • 如果Stats字段的值包含单引号,一定要用Replace("'", "''")转义,否则RowFilter会报错。
  • 多选时用OR逻辑,就能同时显示符合任意选中状态的行。

内容的提问来源于stack exchange,提问作者roberts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:25:47