DataContoller 中的函数 FocusedRecordIndex 没有反应, FocusedRowIndex 正常
- cxgrdtvGrid1DBTableView1.DataController.FocusedRecordIndex := 0; // 定位到第一行, 排序过滤无反应
- cxgrdtvGrid1DBTableView1.DataController.FocusedRowIndex := 0; // 定位到第一行, 排序过滤仍正常
排序对应事件: cxGridDBTableView 中的 DataController 的 OnSortingChanged
过滤对应事件: cxGridDBTableView 中的 DataController 的 Filter 的 OnChanged
对于排序后定位到首行只需要设置 dcofocusTopRowAfterSorting 为 True
1 测试 cxGrid 的 cxGridDBBandTableView 组件在排序或者过滤以后:(单选: MultSelect 属性设置为 False)
排序: devexpress1226 版本的 dcofocusTopRowAfterSorting 设置为 True 即可焦点自动定位到首行, 单选状态下有选中行焦点和颜色标示
过滤: 默认设置, 取消过滤后仍默认过滤时候选中的行, 增加 cxGridDBTableView 中的 DataController 的 Filter 的 OnChanged 如下代码行, 会出现取消过滤后选中首行(焦点和选中行颜色同时定位到第一行)
- [delphi] view plain copy
- var
- Filter: TcxDataFilterCriteria; // 定义过滤器对象
- begin
- with Sender as TcxDataFilterCriteria do
- if IsEmpty then // 操作过滤器触发过滤器事件时判断过滤器是否为空, 即: 是否取消过滤
- begin
- cxgrdtvGrid1DBTableView1.DataController.FocusedRowIndex := 0; // 焦点定位到第一行
- end;
2 针对多选情况变通调整, 否则焦点 (虚线框可以看见) 可以移动, 但是选中行颜色标志 (背景颜色) 不会;(多选: MultSelect 属性设置为 True)
排序: devexpress1226 版本的 dcofocusTopRowAfterSorting 设置为 True 即可焦点自动定位到首行, 多选状态下只有焦点标示无选中行颜色标示
过滤: 默认设置, 取消过滤后仍默认过滤时候选中的行, 增加 cxGridDBTableView 中的 DataController 的 Filter 的 OnChanged 如下代码行, 会出现取消过滤后无论过滤时候选择的一行还是多选都会在此时只选中首行(焦点和选中行颜色同时定位到第一行)
- [delphi] view plain copy
- var
- Filter: TcxDataFilterCriteria;
- begin
- with Sender as TcxDataFilterCriteria do
- if IsEmpty then // 操作过滤器触发过滤器事件时判断过滤器是否为空, 即: 是否取消过滤
- begin
- cxgrdtvGrid1DBTableView1.OptionsSelection.MultiSelect := False;
- cxgrdtvGrid1DBTableView1.DataController.FocusedRowIndex := 0; <span style="font-size:14px;font-family:Arial;">// 焦点定位到第一行</span>
- cxgrdtvGrid1DBTableView1.OptionsSelection.MultiSelect := True;
- end;
3cxGrid1DBTableView 的 OptionsView 属性中的 FocusRect 为 False 就可以看不见虚线框, 即获得焦点行的边框
4 在多选的情况下, 按照以上所说的排序和过滤会出现, 排序后焦点定位到第一行但是默认没有选中(背景色为白色), 而取消过滤后焦点定位到第一行而且默认第一行选中(背景色为蓝色或者其他操作系统主题颜色), 这样就不一致了, 临时解决方案:
都只定位到第一行并且都不选择任何行, 只需要对过滤后的事件代码做一个刷新调整即可:
- [delphi] view plain copy
- var
- Filter: TcxDataFilterCriteria;
- begin
- with Sender as TcxDataFilterCriteria do
- if IsEmpty then
- begin
- cxgrdtvGrid1DBTableView1.DataController.DataSet.Active := False;
- cxgrdtvGrid1DBTableView1.DataController.DataSet.Active := True;
- end;
来源: http://www.bubuko.com/infodetail-2514727.html