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
相关产品推荐
相关产品推荐

