终于搞定了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则是通过从上到下、从左到右设置单元格信息来完成的:首先为每一列指定所处列序号,然后顺序增加该列中的所有单元格,完成后再进行下一列的设置

终于搞定了cxgrid的多行表头(转终于搞定了cxgrid的多行表头 )的更多相关文章

  1. iOS开发——实用技术OC篇&8行代码教你搞定导航控制器全屏滑动返回效果

    8行代码教你搞定导航控制器全屏滑动返回效果 前言 如果自定了导航控制器的自控制器的leftBarButtonItem,可能会引发边缘滑动pop效果的失灵,是由于 self.interactivePop ...

  2. Axure中继器基础教程(增行、删当前、标记、全部、规则行) Mark

    ---恢复内容开始--- 一.中继器的新增行 中继器所显示的列表项与中继器的数据集有关,默认情况下是一一对应的.也就是说,中继器数据集中有多少行数据,那么,列表项就有多少个. 那么,我们能不能通过新增 ...

  3. java,编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz.

    需求:编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz. package study01; public cla ...

  4. 行内元素与块级元素的区别,行内块级元素在IE8-的兼容性

    行内元素与块级元素的区别 行内元素最好不要包裹块级元素,但是块级元素可以任意的包裹行内元素 行内元素如果其上一个元素也是行内元素,则他们会分布在统一水平线上,即在一行上排列,块级元素不论上一个元素是行 ...

  5. Creator 2.2.0 终于等来了这款Shader组件神器!一招搞定Effect特效

    先看下视频演示: ShaderHelper2支持Creator 2.2.0 视频录完后才想起,还没在微信小游戏中测试,赶紧试试,下面是在微信开发者工具中的截图. 径向模糊 探照灯 提供了一个Shade ...

  6. 几行代码把Chrome搞崩溃之:HTML5 MP3录音由ScriptProcessorNode升级成AudioWorkletNode采坑记

    关键词: STATUS_ACCESS_VIOLATION AudioContext AudioWorkletNode audioWorklet addModule resume suspended c ...

  7. 如何修改word文档中每行字符的最大默认值和每页最大行数默认值

    事情起因是这样的,小明在写论文的过程中,发现自己的文档的字与字的间距看起来比其他人的字符间距大,于是觉得奇怪,明明设置了一样的格式啊,设置每行38个字符,每页34行,为什么小明写的文档字符间距看着比较 ...

  8. 非IT人士的云栖酱油之行 (程序猿迷妹的云栖之行)

    摘要: 熟悉我的人都知道,我是一个贪玩儿且不学无术的姑娘,对于互联网我也是知之甚少:这次去到杭州参加阿里巴巴集团主办的为期4天的科技大会也是很例外:但是不得不说这次的会议真是让我很震惊.今天我就和大家 ...

  9. 获取当前方法名,行号,类名,所在java文件第几行

    public class Demo { public static void main(String[] args) { Demo demo = new Demo(); demo.go(); } pu ...

随机推荐

  1. 【HTML5】HTML5 综合

    HTML5教程: 视频教程:http://www.socss.cn/html5视频教程大集合/ DCloud关于HTML5:http://ask.dcloud.net.cn/docs 开发工具:HBu ...

  2. JS高级程序设计第三版——JavaScript简介

    JavaScript简史 JavaScript由Netscape(网景)公司在1995年发布,最开始的主要目的是处理以前由服务器端语言负责的一些输入验证操作,以便提高用户体验,后来就慢慢的发展为一门强 ...

  3. attention机制的实现

    本文转自,http://www.jeyzhang.com/understand-attention-in-rnn.html,感谢分享! LSTM 中实现attention:https://distil ...

  4. Selenium2学习(十二)-- alert\confirm\prompt

    前言 不是所有的弹出框都叫alert,在使用alert方法前,先要识别出到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决. alert\confirm\prompt ...

  5. 查看锁定的session信息脚本

    查看当前被阻塞的对象和锁信息SELECT DISTINCT       s1.inst_id BlockingInst,       s1.sid BlockingSid,       s1.seri ...

  6. Orchard Core 使用工作流处理审批和创建内容项

    译自:http://www.ideliverable.com/blog/orchard-core-workflows-walkthrough-content-approval 转载请注明出处, 原文地 ...

  7. 初识Git与Github

    学习和使用Git和Github的确是一件很有意义的事,通过使用Git和Github,可以让我们很方便地管理自己的各种文件,还可以帮助一名程序员更好地用于代码管理.而对于一名软件技术人员,建立自己的Gi ...

  8. python接口测试-项目实践(三)数据的处理示例

    三 数据处理 枚举值的转换.如接口返回1-5,需转成对应的中文. typecap = findinfo_from_api(result, 'TypeCap') dictcap = {': '微盘'} ...

  9. python 带BOM头utf-8的响应解码

    接口响应编码格式为带BOM头utf-8.直接获取响应的text出现乱码. '''dinghanhua2018-11requests text与content,指定响应的encoding''' api ...

  10. Ubuntu 配置java环境变量

    1.使用如下命令,打开/etc/profile: $sudo vi /etc/profile 2.进入编辑模式,在末尾添加: #developer enviroment, add by myself ...