如何给DBGRID 单元格上色

时间:2021-10-24 19:28:03
就是我根据每一行最后一个字段的值的判断来给该行第一个字段的字体或者背景改变颜色。该怎么实现?

12 个解决方案

#1


自己改一改,我这个是DBGridEh1的跟你的差不多,我这个是根据记录号的单双变化的颜色,你相应的改一下
void __fastcall TForm1::DBGridEh1DrawDataCell(TObject *Sender,
      const TRect &Rect, TField *Field, Gridseh::TGridDrawState State)
{

      if(  DBGridEh1->DataSource->DataSet->RecNo%2==0)
                {
                DBGridEh1->Canvas->Brush->Color = clCream;//clSkyBlue;//

                }else{
                  DBGridEh1->Canvas->Brush->Color = clMoneyGreen;
                         }
   if(State.Contains(Gridseh::gdSelected))
                         DBGridEh1->Canvas->Brush->Color = TColor(0x00800040);//clAqua;
   if(State.Contains(Gridseh::gdFocused))
                         DBGridEh1->Canvas->Brush->Color = TColor(0x00800040);//clAqua;
                 DBGridEh1->DefaultDrawDataCell(Rect,Field,State);        
}

#2


根据数值改变字体颜色

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{
   DBGrid1->Canvas->Brush->Style= bsSolid;
   DBGrid1->Canvas->Brush->Color=State.Contains(gdSelected) ? (TColor)RGB(49,106,197) : Column->Field->DataSet->RecNo%2 != 0 ? clWhite : clCream;;
   DBGrid1->Canvas->FillRect(Rect);

   DBGrid1->Canvas->Pen->Style=psSolid;
 //  DBGrid1->Canvas->Font->Style=TFontStyles()<< fsBold;
   DBGrid1->Canvas->Font->Color=clBlack;
   int ARow=Column->Field->DataSet->RecNo,ACol=DataCol;

   if (   ACol==4 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[0]
        || ACol==5 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[1]
        || ACol==6 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[2]
        || ACol==7 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[3]
        || ACol==8 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[4]
        || ACol==9 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[5]
        || ACol==10 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[6]
        || ACol==11 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[7]
        || ACol==13 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[8]
        )
           {
             DBGrid1->Canvas->Font->Color   = State.Contains(gdSelected) ? clBlack : clRed;
            }

    if(ACol==0 &&  sts.Pos(Column->Field->Text))
       DBGrid1->Canvas->Font->Color   = State.Contains(gdSelected) ? clBlack : clBlue;

   DrawText(DBGrid1->Canvas->Handle, Column->Field->Text.c_str(),-1,(RECT*)&Rect,DT_SINGLELINE | DT_VCENTER |DT_CENTER);

}

#3


我知道通过某字段的值来给该字段改颜色的方法,但是我要的是 通过另一个字段的值来作为判断是否给第一个字段改变颜色啊

#4


引用 3 楼 cjlu_xiaok 的回复:
我知道通过某字段的值来给该字段改颜色的方法,但是我要的是 通过另一个字段的值来作为判断是否给第一个字段改变颜色啊
有何不同?????

#5


你发的 代码 只是根据行数的单偶不同 使不同行 改变颜色,我需要的是 根据该行的某一字段的值的判断来改变改行另一个字段 颜色

#6


根据这个代码稍加改动就ok了,不能只动口呀,还得动手动脑
引用 5 楼 cjlu_xiaok 的回复:
你发的 代码 只是根据行数的单偶不同 使不同行 改变颜色,我需要的是 根据该行的某一字段的值的判断来改变改行另一个字段 颜色

#7


不是我不肯动脑,根据我网上找的例子,我现在只能在具体的某个单元格的判断给当前的单元格上色,但我要根据这个单元格的值来给另一个单元值上色的时候,我用If语句可以写出判断的语句,那后面我怎么写表示另外具体某一个单元格的颜色改变语句?我现在是不知道DBGRID具体某一个单元格怎么表示。

    换句话说,你的例子只是,根据当前行的判断来来给当前行上色(你if 下面的语句只是给你if条件里里面所指的那行来上色),我之前百度时候就看到过跟你发的一样的代码。 
    如果您不嫌麻烦,你可以随便举个我要求的例子,我想我还是可以自己根据例子改动的

#8


知道你说的意思了,不好意思,没有仔细考虑你这个需求。你这个需求不能在这个事件里面处理。如果是listview就好处理了。

#9


你这个需求又考虑了一下,你要用现有的数据来控制已有的单元格的颜色,这个单元格肯定是已经生成的了,估计只能换stringgrid,或lisiview这类的,根据数据自己画。象DBGrid这种数据感知的控件估计不行。

#10


我的那个代码就是根据字段值来改改变单元格颜色

#11


int w,h;
AnsiString s;
bool bf;
if (DataCol==0)//某一列
{
bf=BetResult->FieldByName("BetFull")->AsBoolean;//取对应数据表某一字段值
dbtable->Canvas->Font->Color=clWhite;//字体颜色
if (bf) {
dbtable->Canvas->Brush->Color=clBlue;//背景色
s="全";
}
else
{
dbtable->Canvas->Brush->Color=clGreen;
s="半";
}
h=dbtable->Canvas->TextHeight(s);
w=dbtable->Canvas->TextWidth(s);
//居中显示
dbtable->Canvas->TextRect(Rect,(Rect.Right+Rect.Left-w)/2,(Rect.Bottom+Rect.Top-h)/2,s);
//左对齐
//dbtable->Canvas->TextRect(Rect,Rect.Left+2,(Rect.Bottom+Rect.Top-h)/2,s);
//右对齐
//dbtable->Canvas->TextRect(Rect,Rect.Right-w-2,(Rect.Bottom+Rect.Top-h)/2,s);
}

#12


楼主参考以上这几个代码试试吧,应该是可以的。我在8,9楼说的不对,我也考虑错了。

#1


自己改一改,我这个是DBGridEh1的跟你的差不多,我这个是根据记录号的单双变化的颜色,你相应的改一下
void __fastcall TForm1::DBGridEh1DrawDataCell(TObject *Sender,
      const TRect &Rect, TField *Field, Gridseh::TGridDrawState State)
{

      if(  DBGridEh1->DataSource->DataSet->RecNo%2==0)
                {
                DBGridEh1->Canvas->Brush->Color = clCream;//clSkyBlue;//

                }else{
                  DBGridEh1->Canvas->Brush->Color = clMoneyGreen;
                         }
   if(State.Contains(Gridseh::gdSelected))
                         DBGridEh1->Canvas->Brush->Color = TColor(0x00800040);//clAqua;
   if(State.Contains(Gridseh::gdFocused))
                         DBGridEh1->Canvas->Brush->Color = TColor(0x00800040);//clAqua;
                 DBGridEh1->DefaultDrawDataCell(Rect,Field,State);        
}

#2


根据数值改变字体颜色

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{
   DBGrid1->Canvas->Brush->Style= bsSolid;
   DBGrid1->Canvas->Brush->Color=State.Contains(gdSelected) ? (TColor)RGB(49,106,197) : Column->Field->DataSet->RecNo%2 != 0 ? clWhite : clCream;;
   DBGrid1->Canvas->FillRect(Rect);

   DBGrid1->Canvas->Pen->Style=psSolid;
 //  DBGrid1->Canvas->Font->Style=TFontStyles()<< fsBold;
   DBGrid1->Canvas->Font->Color=clBlack;
   int ARow=Column->Field->DataSet->RecNo,ACol=DataCol;

   if (   ACol==4 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[0]
        || ACol==5 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[1]
        || ACol==6 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[2]
        || ACol==7 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[3]
        || ACol==8 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[4]
        || ACol==9 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[5]
        || ACol==10 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[6]
        || ACol==11 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[7]
        || ACol==13 && ARow>0 && StrToFloat(Column->Field->Text)>ad->MaxValue[8]
        )
           {
             DBGrid1->Canvas->Font->Color   = State.Contains(gdSelected) ? clBlack : clRed;
            }

    if(ACol==0 &&  sts.Pos(Column->Field->Text))
       DBGrid1->Canvas->Font->Color   = State.Contains(gdSelected) ? clBlack : clBlue;

   DrawText(DBGrid1->Canvas->Handle, Column->Field->Text.c_str(),-1,(RECT*)&Rect,DT_SINGLELINE | DT_VCENTER |DT_CENTER);

}

#3


我知道通过某字段的值来给该字段改颜色的方法,但是我要的是 通过另一个字段的值来作为判断是否给第一个字段改变颜色啊

#4


引用 3 楼 cjlu_xiaok 的回复:
我知道通过某字段的值来给该字段改颜色的方法,但是我要的是 通过另一个字段的值来作为判断是否给第一个字段改变颜色啊
有何不同?????

#5


你发的 代码 只是根据行数的单偶不同 使不同行 改变颜色,我需要的是 根据该行的某一字段的值的判断来改变改行另一个字段 颜色

#6


根据这个代码稍加改动就ok了,不能只动口呀,还得动手动脑
引用 5 楼 cjlu_xiaok 的回复:
你发的 代码 只是根据行数的单偶不同 使不同行 改变颜色,我需要的是 根据该行的某一字段的值的判断来改变改行另一个字段 颜色

#7


不是我不肯动脑,根据我网上找的例子,我现在只能在具体的某个单元格的判断给当前的单元格上色,但我要根据这个单元格的值来给另一个单元值上色的时候,我用If语句可以写出判断的语句,那后面我怎么写表示另外具体某一个单元格的颜色改变语句?我现在是不知道DBGRID具体某一个单元格怎么表示。

    换句话说,你的例子只是,根据当前行的判断来来给当前行上色(你if 下面的语句只是给你if条件里里面所指的那行来上色),我之前百度时候就看到过跟你发的一样的代码。 
    如果您不嫌麻烦,你可以随便举个我要求的例子,我想我还是可以自己根据例子改动的

#8


知道你说的意思了,不好意思,没有仔细考虑你这个需求。你这个需求不能在这个事件里面处理。如果是listview就好处理了。

#9


你这个需求又考虑了一下,你要用现有的数据来控制已有的单元格的颜色,这个单元格肯定是已经生成的了,估计只能换stringgrid,或lisiview这类的,根据数据自己画。象DBGrid这种数据感知的控件估计不行。

#10


我的那个代码就是根据字段值来改改变单元格颜色

#11


int w,h;
AnsiString s;
bool bf;
if (DataCol==0)//某一列
{
bf=BetResult->FieldByName("BetFull")->AsBoolean;//取对应数据表某一字段值
dbtable->Canvas->Font->Color=clWhite;//字体颜色
if (bf) {
dbtable->Canvas->Brush->Color=clBlue;//背景色
s="全";
}
else
{
dbtable->Canvas->Brush->Color=clGreen;
s="半";
}
h=dbtable->Canvas->TextHeight(s);
w=dbtable->Canvas->TextWidth(s);
//居中显示
dbtable->Canvas->TextRect(Rect,(Rect.Right+Rect.Left-w)/2,(Rect.Bottom+Rect.Top-h)/2,s);
//左对齐
//dbtable->Canvas->TextRect(Rect,Rect.Left+2,(Rect.Bottom+Rect.Top-h)/2,s);
//右对齐
//dbtable->Canvas->TextRect(Rect,Rect.Right-w-2,(Rect.Bottom+Rect.Top-h)/2,s);
}

#12


楼主参考以上这几个代码试试吧,应该是可以的。我在8,9楼说的不对,我也考虑错了。