cxGrid实现取消过滤和排序后定位到首行(单选和多选)
- 2107
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如下代码行,会出现取消过滤后选中首行(焦点和选中行颜色同时定位到第一行)
- 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如下代码行,会出现取消过滤后无论过滤时候选择的一行还是多选都会在此时只选中首行(焦点和选中行颜色同时定位到第一行)
- 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;
3、cxGrid1DBTableView的OptionsView属性中的FocusRect为False就可以看不见虚线框,即获得焦点行的边框
4、在多选的情况下,按照以上所说的排序和过滤会出现,排序后焦点定位到第一行但是默认没有选中(背景色为白色),而取消过滤后焦点定位到第一行而且默认第一行选中(背景色为蓝色或者其他操作系统主题颜色),这样就不一致了,临时解决方案:
都只定位到第一行并且都不选择任何行,只需要对过滤后的事件代码做一个刷新调整即可:
- var
- Filter: TcxDataFilterCriteria;
- begin
- with Sender as TcxDataFilterCriteria do
- if IsEmpty then
- begin
- cxgrdtvGrid1DBTableView1.DataController.DataSet.Active := False;
- cxgrdtvGrid1DBTableView1.DataController.DataSet.Active := True;
- end;