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

Delphi中TcxGrid开启GridMode模式时如何使用自定义筛选功能

TcxGrid GridMode模式下完整筛选功能实现方案

基础配置

  • 首先设置Data Controller的Filter.AutoDataSetFilter属性为True,这一步是核心基础,确保筛选表达式可以直接同步到底层数据集执行,不需要Grid本地缓存全量数据,完全符合GridMode的性能优化要求。

GridMode下默认不会自动生成列下拉筛选的可选值列表,可通过以下三个事件按需实现自定义筛选项:

1. 列级OnGetFilterValues事件(适合单个列自定义筛选项)

该事件直接绑定到对应Grid列,可针对单个列生成专属筛选列表,示例代码:

procedure TForm1.cxGrid1DBTableView1Column1GetFilterValues(
  Sender: TcxCustomGridTableItem; AValueList: TcxDataFilterValueList);
var
  I: Integer;
  DistinctValues: TStringList;
begin
  DistinctValues := TStringList.Create;
  DistinctValues.Sorted := True;
  DistinctValues.Duplicates := dupIgnore;
  try
    // 从底层数据集查询该列非重复值,数据量大时建议用SQL分组查询去重,不要遍历全表
    YourDataSet.DisableControls;
    try
      YourDataSet.First;
      while not YourDataSet.Eof do
      begin
        DistinctValues.Add(YourDataSet.FieldByName('绑定字段名').AsString);
        YourDataSet.Next;
      end;
    finally
      YourDataSet.EnableControls;
    end;
    // 清空默认空列表
    AValueList.Clear;
    // 先添加通用筛选选项
    AValueList.Add(fviAll, Null, '所有', True);
    AValueList.Add(fviBlanks, Null, '空值', True);
    AValueList.Add(fviNonBlanks, Null, '非空值', True);
    // 写入查询到的非重复值
    for I := 0 to DistinctValues.Count - 1 do
    begin
      AValueList.Add(fviValue, DistinctValues[I], DistinctValues[I], True);
    end;
  finally
    DistinctValues.Free;
  end;
end;

提示:如果列绑定的是枚举类、关联ID类字段,不要直接存储值到筛选列表,可搭配下文中的OnGetFilterDisplayText事件做显示值转换。


2. 列级OnGetFilterDisplayText事件(自定义筛选项显示文本)

如果筛选项需要显示和实际存储值不同的文本(比如存的是状态ID,显示的是状态名称),用该事件实现转换:

procedure TForm1.cxGrid1DBTableView1Column1GetFilterDisplayText(
  Sender: TcxCustomGridTableItem; const AValue: Variant; var AText: string);
begin
  if VarIsNull(AValue) then Exit;
  // 示例:状态字段值转换
  case AValue of
    0: AText := '未激活';
    1: AText := '正常';
    2: AText := '已禁用';
  end;
end;

3. Data Controller级OnGetValueList事件(批量处理所有列筛选项)

如果有多个列需要自定义筛选项,不需要逐个列绑定事件,直接在Data Controller级别统一处理:

procedure TForm1.cxGrid1DBTableView1DataControllerGetValueList(
  Sender: TcxCustomDataController; AItemIndex: Integer;
  AValueList: TcxDataFilterValueList);
var
  Column: TcxGridDBColumn;
begin
  Column := Sender.GetItem(AItemIndex) as TcxGridDBColumn;
  // 按字段名区分处理逻辑
  if Column.DataBinding.FieldName = 'status' then
  begin
    // 对应status字段的筛选项生成逻辑,和OnGetFilterValues逻辑一致
  end
  else if Column.DataBinding.FieldName = 'dept_id' then
  begin
    // 对应dept_id字段的筛选项生成逻辑
  end;
end;

注意事项

  • GridMode下所有筛选逻辑最终都由底层数据集执行,确保你的数据集支持Filter属性或对应SQL过滤能力,建议给常用筛选字段添加数据库索引,避免筛选过慢。
  • 数据量极大的场景下,不要全表遍历获取非重复值,改用SELECT DISTINCT 字段 FROM 表的方式直接从数据库查询筛选项,性能提升更明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:39:03