终于搞定了cxgrid的多行表头
转自:http://mycreature.blog.163.com/blog/static/556317200772524226400/
这一周都在处理dbgrideh向cxgrid迁移的问题,在感叹cxgrid功能强大的同时不得不面对这种强大带来的高昂的学习成本,然后就开始感叹相关材料的缺乏。虽然可以从cxgrid的帮助文件中获取相当多有用的信息,但帮助文档中的内容更多集中在设计时的设置,对于运行时的设置的介绍相当有限,而项目里的grid大都是动态配置生成的;而网络上关于cxgrid的资料就更少了,翻来覆去都是转载自那两三篇源文章的内容。于是就出现了为了实现一个类似图一的多行表头而花了我快两天的时间的状况。
dbgrideh中的实现
dbgrideh中设置多行表头的实现很简单,把UseMultiTitle属性设置为true,然后设置带层次结构的列标题。 列标题的层次结构设置规则为: 列标题可以由多个层次组成,不同层次内容用"|"分割开,dbgrideh会自动处理层次之间的相同和不同内容。
范例代码如下: DBGridEh.Columns[0].Title.Caption := '年段|1班'; DBGridEh.Columns[1].Title.Caption := '年段|2班';
cxgrid中的实现
cxgrid中设置多行表头的实现主要通过列中的Position.BandIndex属性来设置,该属性用来设置某个band对应的上级band。把如果把某个band的Position.BandIndex指定上一个band的序号,则该band则会出现在上一个band的所处列的下方。
范例代码如下: //增加单元的实现方法 procedure addBandImpl(view:TcxGridDBBandedTableView;cptText:String;align:TAlignment;append:boolean); const MC_OFFSET_PARENT = 1; var idx : Integer; begin idx := view.Bands.Count; with view.Bands.Add do begin Caption := cptText; Alignment := align; Position.ColIndex := idx; if append then Position.BandIndex := idx-MC_OFFSET_PARENT else Position.BandIndex := idx; Options.HoldOwnColumnsOnly := true; end; end;
//增加列的首个单元格 procedure addCXBand(view:TcxGridDBBandedTableView;cptText:String;align:TAlignment=taCenter); begin addBandImpl(view,cptText,align,false); end;
//增加列的后续单元格 procedure appendCXBand(view:TcxGridDBBandedTableView;cptText:String;align:TAlignment=taCenter); begin addBandImpl(view,cptText,align,true); end;
//增加规格列表单元格 procedure addBandsOfSpecList(view:TcxGridDBBandedTableView;colIdx:Integer;objList:TObjectList); var objIdx : Integer; specText : String; holder : TSpecHolder; begin for objIdx:=0 to objList.Count-1 do begin //构造band的名称(TSpecHolder中存储每个规格行对应的具体规格项,数目不等) holder := TSpecHolder(objList[objIdx]); if holder.getSpecCount>colIdx then specText := holder.getSpecItems[colIdx] else specText := ''; //判断是否新增一列 if objIdx=0 then addCXBand(view,specText,taCenter,false) else appendCXBand(view,specText); end; end;
两种实现方式比较
如果把多表头当作二维表来看待的话,dbgrideh多表头的实现方式是通过从左到右设置包含行信息("|"用来区分不同行)的列来完成的,而cxgrid则是通过从上到下、从左到右设置单元格信息来完成的:首先为每一列指定所处列序号,然后顺序增加该列中的所有单元格,完成后再进行下一列的设置