• CxGrid 改变某行或单元格的颜色


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

    最后证明,下面这个方法是可行的

    比如AViewInfo.Item.ID in [i, j] 或AviewInfo.RecordViewInfo.GridRecord.Values[i]为第i列符合条件的值.
    if (AViewInfo.Item.ID in [6, 7]) and (trim(AViewInfo.RecordViewInfo.GridRecord.Values[8]) = 'T') then
    begin
    ACanvas.Brush.Color := clmoneygreen;
    ACanvas.Font.Name := 'Times New Roman';
    ACanvas.Font.Size := 10;
    ACanvas.Font.Color := clCaptionText;
    end;

     
  • 相关阅读:
    UltraWebGrid多表头
    2009个人年度总结报告(IT)
    DevExpress分发
    AspxTreeList数据绑定以及模板和外观定制的运用
    每日一句英语:No problem, Mr. Smith. Anything else?
    “向程序发送命令时出现问题”的解决方法
    ASP常用进制转化类(2,8,10,16,32,64)
    我的分页用户控件(性能问题)
    研发的那些事2—设计之惑
    一个架构的演化2用ESB集成
  • 原文地址:https://www.cnblogs.com/westsoft/p/8950085.html
Copyright © 2020-2023  润新知