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

如何为DataTable.DefaultView.RowFilter动态追加多选中复选框的筛选条件

DevExpress categoryCheckedListBox多选项筛选实现方案

实现代码

private void categoryCheckedListBox_ItemCheck(object sender, DevExpress.XtraEditors.Controls.ItemCheckEventArgs e)
{
    var dt = productListGV.DataSource as DataTable;
    if (dt == null) return;

    // 可选:修复ItemCheck事件中CheckedItems未同步本次变更的问题
    var currentItem = categoryCheckedListBox.Items[e.Index];
    if (e.State == CheckState.Checked)
    {
        if (!categoryCheckedListBox.CheckedItems.Contains(currentItem))
            categoryCheckedListBox.CheckedItems.Add(currentItem);
    }
    else
    {
        if (categoryCheckedListBox.CheckedItems.Contains(currentItem))
            categoryCheckedListBox.CheckedItems.Remove(currentItem);
    }

    // 收集所有已选中分类,转义单引号避免筛选语法错误
    var checkedCategories = categoryCheckedListBox.CheckedItems
        .Select(item => item.Value.ToString().Replace("'", "''"))
        .ToList();

    if (checkedCategories.Count == 0)
    {
        dt.DefaultView.RowFilter = null;
        return;
    }

    // 生成多分类筛选条件,多个分类用OR拼接(可根据业务需求改为AND)
    var kata2Conditions = checkedCategories.Select(c => $"Kata2 LIKE '%{c}%'");
    string kata2Filter = string.Join(" OR ", kata2Conditions);
    // 转义Cins变量的单引号
    string cinsEscaped = Cins.Replace("'", "''");
    string fullFilter = $"({kata2Filter}) AND Kata1 LIKE '%{cinsEscaped}%'";

    dt.DefaultView.RowFilter = fullFilter;
}

原直接拼接报错的原因

  • 直接用+=拼接RowFilter会导致逻辑冗余、出现多余的AND/OR关键字,不符合DataView.RowFilter的语法规范,因此报错
  • 每次触发事件时重新遍历所有选中项生成完整的筛选条件,逻辑更可控,不会出现语法错误

注意事项

  • 代码中默认多个选中分类为或的关系,即匹配任意一个已选中分类即可,如果需要同时匹配多个分类,可将拼接的OR改为AND
  • 所有字符串变量都做了单引号转义处理,避免分类名或Cins包含单引号时触发语法错误

内容的提问来源于stack exchange,提问作者Mustafa Yasin Çelik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:54:03