终于搞定了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. visual studio code配置项

    // 通过将设置放入设置文件中来覆盖设置. { //-------- 编辑器配置 -------- // 控制字体系列. "editor.fontFamily": "Co ...

  2. 调查UIRecorder 测试报告的CI(集成)实现方式

    以下内容来自uirecorder官网: 如何接入Jenkins? 添加命令 source ./install.sh source ./run.sh 添加报告 JUnit: reports/index. ...

  3. 【java开发系列】—— java输入输出流

    前言 任何语言输入输出流都是很重要的部分,比如从一个文件读入内容,进行分析,或者输出到另一个文件等等,都需要文件流的操作.这里简单介绍下reader,wirter,inputstream,output ...

  4. vue v-on:事件

    1.js代码 var box=new Vue({ el:'.box', data:{ msg:'hello' }, methods:{ /*方法放置区,函数*/ show:function(){ // ...

  5. ZT acct 中文man页面(1)

    acct 中文man页面(1) 2011-08-18 13:57 佚名 博客转载 我要评论(0) 字号:T | T 如果在内核编译时开启了进程记账选项(CONFIG_BSD_PROCESS_ACCT) ...

  6. 我的HTML总结之HTML发展史

    HTML是Web统一语言,这些容纳在尖括号里的简单标签,构成了如今的Web. 1991年,Tim Berners-Lee编写了一份叫做“HTML标签”的文档,里面包含了大约20个用来标记网页的HTML ...

  7. Codeforces Round #375 (Div. 2) D. Lakes in Berland (DFS或并查集)

    D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. ASP.NET MVC有用工具

    Route Debugger https://www.nuget.org/packages/routedebugger 在Asp.Net MVC程序中,路由(Route)是一个非常核心的概念,可以说是 ...

  9. ImageNet Classification with Deep Convolutional Nerual Networks(AlexNet)

    Architecture: 整个网络8层,5个卷积层,3个全连接层 Relu Nonlinearity: 非饱和的relu比饱和的sigmoid或者tanh训练速度快很多,并有效解决梯度消失 Over ...

  10. webapi是如何绑定参数的(How WebAPI does Parameter Binding)

    原文地址 由于工作原因,要使用ASP.NET WEBAPI(非mvc webapi),前几天时间一直很紧张,所以webapi一直将就用,今天下午好不容易有时间终于看了下,解决了自己一直疑惑的问题,在此 ...