如何让Dbgrid内的单元格根据条件变化显示格式?(100分)

  • 主题发起人 主题发起人 lianzj
  • 开始时间 开始时间
L

lianzj

Unregistered / Unconfirmed
GUEST, unregistred user!
我用query实现动态查询,在dbgrid中显示。在其中的一个字段中,我想在“空”的情况下
让单元格显示灰色。ongettext? onsettext? ondrawcolumncell?
 
在onDrawDataCell事件中加入以下代码:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if field.IsNull then
begin
DBGrid1.Canvas.Brush.Color:=clGray;
DBGrid1.Canvas.FillRect(Rect);
end;
DBGrid1.DefaultDrawDataCell(Rect,field,state);
end;
 
to eyss4:
事件不能触发DBGrid1DrawDataCell事件,
1。包括把代码复制到DBGrid1DrawColumnCell上执行,
2。在defaultdrawing:=false时数据被背景色覆盖,只有双击有数据的cell才能显示该cell
的数据,同样也不能触发事件,
3。》》》????
 
第2个问题好解决:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if field.IsNull then
begin
DBGrid1.Canvas.Brush.Color:=clGray;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.font.color:=clBlack;
DBGrid1.Canvas.Textout(Field.asstring);
end
else
DBGrid1.DefaultDrawDataCell(Rect,field,state);
end;
第1,第3,什么意思????????????????
 
顺便问一句,当我单击一个cell时,如何获得其左上方的坐标?
 
to eyes4:
>>if field.IsNull then
>> begin
>>……
DBGrid1.Canvas.Textout(Field.asstring);
>>……
Field.IsNull为True的话,Field.AsString岂不是为空?用TextOut还有意义吗?
估计lianzj不是这个意思吧。不过俺确实没看懂什么意思:)
 
其实我只是想说明Dbgrid.OnDrawDataCell事件不被触发,说那三点是我解决的措施,但都无效
(只怪小弟一时心急表达不清)。
后来我发现在Dbgrid中使用了Dbgrid.Columns后,是做成不被触发的原因,Dbgrid.Columns能
美化数据表,而且能把需要在程序中使用又不让用户看到的东东隐含。你说什么办?
 
不会吧?
我试了一下用静态Columns也没问题呀(DefaultDrawing可以不设为False,效果一样的)。
再说字段都为空了,怎么还会有“数据被背景色覆盖”的问题?
 
DBGrid1DrawDataCell-->
DBGrid1DrawColumnCell

if field.IsNull then
begin
DBGrid1.Canvas.Brush.Color:=clGray;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.font.color:=clBlack;
DBGrid1.Canvas.Textout(Field.asstring);
end
else
begin
DBGrid1.Canvas.Brush.Color:=yourcolor;//new
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.font.color:=clBlack;
DBGrid1.Canvas.Textout(Field.asstring);
// DBGrid1.DefaultDrawDataCell(Rect,field,state);
end;
 
奇怪?只要我在Dbgril中增加了columns(不管是一个或所有字段)那些灰色就是去掉,只有在
没有columns,才能重现出灰色。
不过我也觉得有冲突,columns中也有fonts,colour的属性,Dbgril.onDrawdataCell事件描
绘出来的colour,是否给Columns.Colour属性所覆盖呢?
 
别用OnDrawDataCell,Delphi本身不鼓励用的,它是为保持兼容才留的。
试试在OnDrawColumnCell里写——
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (Column.Field.FieldName = 'f1') and Column.Field.IsNull then//把'f1'换成你实际的字段名
DBGrid1.Canvas.Brush.Color := clGray;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
 
to dq:
为什么delphi不能识别 (Column.Field.FieldName = 'f1') 次句,判断它为'假',而不能执行
then后的语句?我用DbGrid1.Columns[2].field.isNull语句,程序把整一列变为灰色,还是搞不懂?
不过你提出的用OnDrawColumnsCell的确有道理?原本想剩下的小问题自己搞掂,但还是不行,
真麻烦你!
 
不是吧?你难道没有把'f1'换成你要用的字段名?还是写成了Column的显示标题?
要么再试试 if (Column.Index = 2) and Column.Field.IsNull then ...

OnDrawColumnCell是在任意一个单元格需要刷新的时候触发的,比如第三列第三行是空的,
那就只能在[2,2]这一格刷新的时候改变Canvas的相关属性,
所以要同时结合Column.Index(或Column.Field.FieldName)这样的能确定列的属性,
和Field.IsNull这样的能确定行的条件共同判断;
如果只用DbGrid1.Columns[2].field.isNull这样的语句,那么只要在第三行(即第三条记录)
中任意一格刷新的时候该条件都为True,这样整个第三行就应该都变灰了
(所以我怀疑你是不是把“行”错写成“列”了?)。

如果还搞不定,我看就得把你的源码贴出来看看了。
 
dq兄:
用Column。index= 2 果然有效,但我还是想明白为什么Column.Field.FieldName就是没效?
Column.Field.FieldName与Column.FieldName是一样的吧?
啊。。。我明白了,“f1”处我用了小写,他是区分大小写的,把它改为大写,Column.Field.FieldName
同样有效。
谢谢!

 
后退
顶部