CxGrid分组互斥展开
原创文章,引用请保留出处。
做一个工具,对要CxGrid分组内容进行浏览查询。其中需要分组互斥展开功能,为的是避免组中记录太多影响使用体验。本想这样简单功能在CxGrid中有现成的方法,可是我在D7和D2010对应版本的Dev控件中没有找到(也可能高版本的Dev有吧)。那只有在万能的网上找了。花费了两个多小时,找到的方法要不不能满足要求,要不就是不能实现。没有办法那只好自己写代码了!为实现此功能尝试了三种方法具体思路是:㈠、获取当前记录号,然后取消分组并使当前记录保持焦点,最后重建分组。此方法可行,但代码实现有点难度,使用体验不好,放弃。㈡、保存当前记录指针,并逐级获取父记录指针并保存,关闭所有分组。最后按父级由高向低逐级展开,最后展开当前记录。此方法没有成功,是因为保存的记录指针是以ViewData为基准的,在当分组改变后记录指针也发生改变。㈢、以当前组索引号为分界,向上、向下关闭所有打开的分组,这样只展开了当前选定的分组。下面的代码就是此方法的具体实现。
效率分析,如果三种方法都可行,那第二种方法效率最高,代码实现也简单,可是.....没有可是了,.留给其它人吧。
代码不长,功能也单一,如果高版本的Dev没有类似功能可以将其集成到Dev中,方便使用。
Procedure TForm1.GDBTV1GroupRowExpanded(Sender: TcxGridTableView;
AGroup: TcxGridGroupRow);
Var I , VRC: Integer;
AcI , ALe : Integer ;
Begin
AcI := AGroup.Index ; // 取当前组索引号
ALe := AGroup.Level ; // 当前组级别
AGroup.Focused := True ; // 当前组获取焦点
VRC := GDBTV1.ViewData.RowCount ; // 可视分组成员数
With GDBTV1.ViewData Do Begin
For I := Pred(VRC) DownTo Succ(AcI) Do
If(Records[I].Expanded) Then
Records[I].Collapse( True );
For I := Pred(AcI) DownTo 0 Do Begin
If( ALe <= Records[I].Level ) Then
If(Records[I].Expanded) Then
Records[I].Collapse( True );
If( ALe > Records[I].Level ) Then
ALe := Records[I].Level ;
End ;
End ;
End ;