1、

【转】CxGrid 改变某行或单元格的颜色

(2016-01-19 09:37:19)

标签:

it

delphi

分类: Delphi

一个表(T)的结构结构如下.

ID Test

1 2001
2 1444
3 1788
5 2645
6 4568

cxGrid成功连接到该表, 如果要实现单元格特效, 就要在cxGridDBTableView的 OnCustomDrawCell
写代码. 该事件声明原形为

type
   TcxGridTableDataCellCustomDrawEvent = procedure(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean) of object;

参数 Sender: 你要实现特效的TableView; ACanvas: 画布, 这个参数比较重要, 就是用这个参数画出

特效; AViewInfo: 自定义条件的来源; 从这个参数中获取单元格值; ADone: 设为真就不会Paint.

下面是以 Test字段的值来控件单元格颜色

var
   CheckValue: integer;
   cxColumn: TcxGridColumn;
begin

cxColumn := (Sender as TcxGridDBTableView).GetColumnByFieldName('Test');
   if cxColumn = nil then
     Exit;

//这个条件用来限制是否只Paint指定的单元格, 去掉则Paint整行.
   if SameText(AViewInfo.Item.Name, cxColumn.Name) then begin
     CheckValue := AViewInfo.GridRecord.Values[gdtvTestTest.Index]; //获取单元格
     //以下是满足条件的字体变色
     if CheckValue >= 4000 then //大于4000为红色
       ACanvas.Font.Color := clRed
     else if CheckValue >= 3000 then //大于3000绿色
       ACanvas.Font.Color := clGreen
     else if CheckValue >= 2000 then //大于2000蓝色
       ACanvas.Font.Color := clBlue;

//以下是满足条件的数据背景变色
   {if CheckValue >= 4000 then begin //大于4000为红色
     AViewInfo.Focused;
     ACanvas.Brush.Color := clRed
   end
   else if CheckValue >= 3000 then //大于3000绿色
     ACanvas.Brush.Color := clGreen
   else if CheckValue >= 2000 then //大于2000蓝色
     ACanvas.Brush.Color := clBlue; }

end;

end;

以上内容为转贴,在使用过程中,发现作者固定了字段Test,而我遇到的问题是:客户提出对cxGrid中不可编辑的列用特别的颜色标记,这时候,字段就不是固定的,于是对上面的代码做了改造:

procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  cxColumn: TcxGridColumn;
  aFieldName:String;
begin
  aFieldName:=TcxGridItemDBDataBinding(AViewInfo.Item.DataBinding).FieldName;

//引用 cxGridDBDataDefinitions单元,才支持TcxGridItemDBDataBinding类.这行取出当前列的字段名
  cxColumn := (Sender as TcxGridDBTableView).GetColumnByFieldName(aFieldName);//按字段名取出Column对象
    if not cxColumn.Options.Focusing then//不允许编辑的列标记为特殊颜色.
      ACanvas.Brush.Color:=clRed;
end;

上面的代码,实现当cxGrid中某一列.Options.Focusing:=False时,用红色显示.

 
 
 
2、这是第二个方式
  1. procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
  2. Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  3. AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
  4. begin
  5. //Item确定列(ID列的索引),RecordViewInfo确定行(Index行的索引)
  6. //可以定位到某一行改变颜色
  7. {if (AViewInfo.Item.ID = 0) and (AViewInfo.RecordViewInfo.Index = 0) then
  8. ACanvas.Brush.Color := clred;}
  9. //可以根据条件值确定改变某行颜色
  10. if (trim(AViewInfo.RecordViewInfo.GridRecord.Values[4]) = 'HTT')
  11. and (AViewInfo.Item.ID = 4) //确定到某一列,如果不加确定是某行底色
  12. then
  13. ACanvas.Brush.Color := clred;
  14. end;

3、看这个贴子

cxgrid几种条件下行变色问题与解决
1 .鼠标选中行变色。
其实默认条件下,鼠标选中的行就会变色,但是被点中的单元格不变色,如果想让单元格和其它列一样的话,在cxGrid1DBTableView中找属性OptionsSelection中的CellSelect的属性变成False.但是默认颜色可能达不到使用者的要求,比如有粉粉控的人只喜欢粉色,想让选中的行变成粉色怎么办呢?很简单,只需要使cxStyleRepository控件在styles中加一种颜色就可以了。效果如图

2 .焦点不再cxgrid表中但数据库中数据对应的行变颜色。
方法有很多,我只说一种,原理是利用数据库中所指的当前行数据,然后对应到cxgrid表上。

procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
if iewinfo.RecordViewInfo.Index=cxGrid1DBTableView1.Da taController.GetFocusedRowIndex then
acanvas.Brush.Color:=clgreen;
end;
1
2
3
4
5
6
7
Item确定列(ID列的索引),RecordViewInfo确定行(Index行的索引)
可以定位到某一行改变颜色
if (AViewInfo.Item.ID = 0) //0列
if (AViewInfo.RecordViewInfo.Index = 0) //0行

3 .固定某行按条件变色
procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
if (AViewInfo.GridRecord.Values[TcxGridDBTableView(Sender).GetColumnByFieldName('SheBeiBianHao').Index])='20050419' then

begin
ACanvas.Brush.Color := clRed;
end;
---------------------
作者:singular2611
来源:CSDN
原文:https://blog.csdn.net/singular2611/article/details/44725359
版权声明:本文为博主原创文章,转载请附上博文链接!

再谈控制 cxGrid 的行列颜色的更多相关文章

  1. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

  2. mui初级入门教程(四)— 再谈webview,从小白变“大神”!

    文章来源:小青年原创发布时间:2016-06-05关键词:mui,html5+,webview转载需标注本文原始地址: http://zhaomenghuan.github.io/#!/blog/20 ...

  3. [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例

    [转载]再谈百度:KPI.无人机,以及一个必须给父母看的案例 发表于 2016-03-15   |   0 Comments   |   阅读次数 33 原文: 再谈百度:KPI.无人机,以及一个必须 ...

  4. 再谈IE的浏览器模式和文档模式

    原文:再谈IE的浏览器模式和文档模式 以前在 “IE8兼容视图(IE7 mode)与独立IE7的区别”一文中曾经涉及过浏览器模式和文档模式,但二者的区别却不甚了了,现在有了新的认识,再补充一下. 1. ...

  5. 再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结

    这篇是对angularJS的一些疑点回顾,是对目前angularJS开发的各种常见问题的整理汇总.如果对文中的题目全部了然于胸,觉得对整个angular框架应该掌握的七七八八了.希望志同道合的通知补充 ...

  6. 再谈前端HTML模板技术

    在web2.0之前,写jsp的时候虽然有es和JSTL,但是还是坚持jsp.后面在外包公司为了快速交货,还是用了php Smart技术. web2.0后,前端模板技术风行. 代表有如下三大类: Str ...

  7. 再谈DOMContentLoaded与渲染阻塞—分析html页面事件与资源加载

    浏览器的多线程中,有的线程负责加载资源,有的线程负责执行脚本,有的线程负责渲染界面,有的线程负责轮询.监听用户事件. 这些线程,根据浏览器自身特点以及web标准等等,有的会被浏览器特意的阻塞.两个很明 ...

  8. 再谈HTTP2性能提升之背后原理—HTTP2历史解剖

    即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...

  9. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...

随机推荐

  1. android 开发 View _8_ 动态图片自定义View

    转载地址:https://blog.csdn.net/mengks1987/article/details/77770922 先来看下效果: 是不是有一种熟悉感,其实这种效果使用序列帧动画也是可以实现 ...

  2. 安装grid时找不到ASM共享磁盘

    1.安装ORACLE数据库集群软件grid时找不到共享磁盘,如下图: 2.网上找过有各种说法,但此处小编的解决方案是:通过重新安装软件:oracleasmlib-2.0.4-1.el6.x86_64. ...

  3. ORACLE_11G归档空间满,由于数据库装完后使用的是默认空间是闪回区

    1.首先根据alert跟踪日志发现归档空间满,路径大致如下:cd $ORACLE_BASE/diag/rdbms/jsswgsjk/jsswgsjk1/tracetail -f alert_jsswg ...

  4. 文件上传:swfupload.js、blueimp-file-upload

    一.swfupload 1.下载swfupload http://code.google.com/p/swfupload/ 2. 3.API  http://www.cnblogs.com/henw/ ...

  5. Python协程、异步IO

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  6. @ResponseBody 与 response.getWriter.write

    @responseBody注解的使用 1. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通 ...

  7. python中并发编程基础1

    并发编程基础概念 1.进程. 什么是进程? 正在运行的程序就是进程.程序只是代码. 什么是多道? 多道技术: 1.空间上的复用(内存).将内存分为几个部分,每个部分放入一个程序,这样同一时间在内存中就 ...

  8. 把post请求的地址粘贴到浏览器地址栏敲回车报错405[Method Not Allowed]

    为什么把post请求的地址粘贴到浏览器地址栏敲回车会报405?原因:在浏览器地址栏敲回车,浏览器默认是以get方式发送请求,而你的请求是post,这样当然会报405了: 405:方法不允许,不支持ge ...

  9. opencv setTo()

    转载至 作者:跬步达千里 opencv的setTo函数是将图像设置为某个值; 例如: 1.有一个Mat src,想将他的值全部设置成0,则可以src.setTo(0) 2.setTo还有更为高级的用法 ...

  10. scrapy -->CrawlSpider 介绍

    scrapy -->CrawlSpider 介绍 1.首先,通过crawl 模板新建爬虫: scrapy genspider -t crawl lagou www.lagou.com 创建出来的 ...