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
有何不同?????
#5
你发的 代码 只是根据行数的单偶不同 使不同行 改变颜色,我需要的是 根据该行的某一字段的值的判断来改变改行另一个字段 颜色
#6
根据这个代码稍加改动就ok了,不能只动口呀,还得动手动脑
#7
不是我不肯动脑,根据我网上找的例子,我现在只能在具体的某个单元格的判断给当前的单元格上色,但我要根据这个单元格的值来给另一个单元值上色的时候,我用If语句可以写出判断的语句,那后面我怎么写表示另外具体某一个单元格的颜色改变语句?我现在是不知道DBGRID具体某一个单元格怎么表示。
换句话说,你的例子只是,根据当前行的判断来来给当前行上色(你if 下面的语句只是给你if条件里里面所指的那行来上色),我之前百度时候就看到过跟你发的一样的代码。
如果您不嫌麻烦,你可以随便举个我要求的例子,我想我还是可以自己根据例子改动的
换句话说,你的例子只是,根据当前行的判断来来给当前行上色(你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);
}
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
有何不同?????
#5
你发的 代码 只是根据行数的单偶不同 使不同行 改变颜色,我需要的是 根据该行的某一字段的值的判断来改变改行另一个字段 颜色
#6
根据这个代码稍加改动就ok了,不能只动口呀,还得动手动脑
#7
不是我不肯动脑,根据我网上找的例子,我现在只能在具体的某个单元格的判断给当前的单元格上色,但我要根据这个单元格的值来给另一个单元值上色的时候,我用If语句可以写出判断的语句,那后面我怎么写表示另外具体某一个单元格的颜色改变语句?我现在是不知道DBGRID具体某一个单元格怎么表示。
换句话说,你的例子只是,根据当前行的判断来来给当前行上色(你if 下面的语句只是给你if条件里里面所指的那行来上色),我之前百度时候就看到过跟你发的一样的代码。
如果您不嫌麻烦,你可以随便举个我要求的例子,我想我还是可以自己根据例子改动的
换句话说,你的例子只是,根据当前行的判断来来给当前行上色(你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);
}
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楼说的不对,我也考虑错了。