终于搞定了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. BIEE入门(一)架构

    BIEE作为Oracle的新的商业智能平台企业版,起源于Oracle所收购的Siebel公司,BIEE原来叫做Siebel Analytic,但是Siebel也不是它的发明者,它是Siebel在200 ...

  2. synchronized(this)、synchronized(class)与synchronized(Object)的区别

    在多线程开发中,我们经常看到synchronized(this).synchronized(*.class)与synchronized(任意对象)这几种类型同步方法.但是是否知道这几种写法有什么区别了 ...

  3. 爬虫入门之urllib库(一)

    1 爬虫概述 (1)互联网爬虫 一个程序,根据Url进行爬取网页,获取有用信息 (2)核心任务 爬取网页 解析数据 难点 :爬虫和反爬虫之间的博弈 (3)爬虫语言 php 多进程和多线程支持不好 ja ...

  4. vue2.x 随记

    1. 外部js调用vue的方法等 将vue实例中的this传入外部js文件(比如作为某方法的参数),即可访问传入实例的所有内容.调用该实例中子组件的方法,用$refs. 2. 路由参数 传递:vm.$ ...

  5. JavaScript工作机制:V8 引擎内部机制及如何编写优化代码的5个诀窍

    概述 JavaScript引擎是一个执行JavaScript代码的程序或解释器.JavaScript引擎可以被实现为标准解释器,或者实现为以某种形式将JavaScript编译为字节码的即时编译器. 下 ...

  6. C#转Java之路之一:线程

    Java实现多线程方式有以下两种: public class HelloWordThread implements Runnable{ public void run(){ System.out.pr ...

  7. 异常:org.hibernate.id.IdentifierGenerationException

    在有关联关系的数据表中保存数据时,先保存一端,再保存多端的抛出的异常(此时不管一端,还是多端的对象都没有设置id,属性,也就是要保存的两个对象的id 属性为空.) org.hibernate.id.I ...

  8. public class Promise<T>: Thenable, CatchMixin

    public class Promise<T>: Thenable, CatchMixin

  9. SQL Server的Bug

    SQL 语句如下: SELECT * FROM Production.Product WHERE ProductNumber IN(SELECT ProductNumber FROM HumanRes ...

  10. 如何学好Spring

    要学好Spring,首先要明确Spring是个什么东西,能帮我们做些什么事情,知道了这些然后做个简单的例子,这样就基本知道怎么使用Spring了.Spring核心是IoC容器,所以一定要透彻理解什么是 ...