zoukankan      html  css  js  c++  java
  • CxGrid 改变某行或单元格的颜色

    一个表(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时,用红色显示.

  • 相关阅读:
    5.2 i++
    5.1 赋值语句
    Implement Queue using Stacks
    Binary Tree Paths
    Single Number III
    Ugly Number
    SurfaceHolder.Callback
    intellj(idea) 编译项目时在warnings 页签框里 报 “xxx包不存在” 或 “找不到符号” 或 “未结束的字符串字面值” 或 “需要)” 或 “需要;”等错误提示
    Hibernate添加日志--log4j
    java实现网页验证码
  • 原文地址:https://www.cnblogs.com/westsoft/p/5969312.html
Copyright © 2011-2022 走看看