zoukankan      html  css  js  c++  java
  • 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;

     
  • 相关阅读:
    vulnhub靶场 之 DC -1
    PHP反序列化中过滤函数使用不当导致的对象注入
    网络内生安全试验场-CTF答题夺旗赛(第四季)web知识
    BUUCTF 随便注
    SWPUCTF 2019 web
    春秋-SQLi题
    i春秋-“百度杯”CTF比赛 十月场-Login
    i春秋-第三届“百越杯”福建省高校网络空间安全大赛-Do you know upload?
    i春秋CTF-“百度杯”CTF比赛 九月场 XSS平台
    终于等到你,最强 IDE Visual Studio 2017 正式版发布
  • 原文地址:https://www.cnblogs.com/westsoft/p/8950085.html
Copyright © 2011-2022 走看看