关于DGrid数据转换?(50分)

  • 主题发起人 主题发起人 yisan
  • 开始时间 开始时间
Y

yisan

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,请问:
  如何将数据库中一些指示性的数据,在数据表格(DBGrid)显示时,
用有实际意义的值替换?如:数据库中性别字段是bit类型,1表示男,
0表示女,在表格(DBGrid)中显示是,如何将这些"0、1"的数据
替换成"男、女"?
 
不知道你是否会是计算字段???
用计算字段很方便的
 
TO:WebExplorer
如果字段是动态创建的,而且有几个这样的字段,你还认为这很方便吗?
在SQL中,好象iif函数可以实现,但不知为什么,我的SQL中不能用这个函数?
 
在该字段的OnGetText事件写如下代码
if Sender.AsBoolean then Text:='男'
else Text:='女'
 
procedure FormCreate(Sender: TObject);
begin
query1.close;
query1.sql.clear;
query1.sql.add(select * from yourtable)
query1.open;
end;


procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumneh; State: TGridDrawState);
var
data,fieldname:string;
rect1:TRect;
pict:integer;
begin
pict:=DT_VCENTER+DT_SINGLELINE;
rect1:=rect;
dbgrid1.Canvas.FillRect(rect1);
fieldname:=uppercase(dbgrid1.column.fieldname);//
if fieldname='SEX' then //‘SEX’必须大写
begin
if query1.fieldbyname(‘sex’).asblooean then
ss:='男' else ss:='女' ;
pict:=pict+DT_RIGHT;
end else
begin
ss:=query1.fieldbyname(fieldname).asString;
pict:=pict+DT_LEFT;
end;
drawtext(dbgrid1.Canvas.Handle,pchar(ss),-1,rect1,pict);
end;
 
TO楼上两位大虾:
  谢谢两位的热心和代码,但如果查询的数据库中有10,000条记录,那么这样
截取每条记录必将严重影响速度,经过探索,我发现如下查询可行:

select id,name,
isnull(nullif(isnull(Cast(nullif(sex,1) as char(3)),'男'),'0'),'女') as Sex
from student

但仍不是很好,请问还有别的方法吗?
 
把defaultdrawing设置为false
然后相应onDrawDataCell事件。。我自己写过一个例子
如下
表中有一个名字为bz的boolean类型字段,我在dbgrid中自己建立了一个名字为abc的列
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
OLDCLO: TCOLOR;
begin
dbgrid1.Canvas.Font.Color := $00000000;

if field.FieldName = 'abc' then //判断是否正在重绘abc字段
begin
dbgrid1.Canvas.Brush.Color := $00FFFFFF;
dbgrid1.Canvas.FillRect(rect);
oldclo := dbgrid1.Canvas.Pen.Color;
dbgrid1.Canvas.Pen.Color := $00FF0000;
if table1.FieldByName('BZ').AsBoolean = True then
begin //如果正在重绘abc并且bz=true 则在abc的位置画圆
DBGRID1.Canvas.Arc(rect.Left, rect.Top, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Left, rect.Top);
end
else
begin //abc的位置画叉
dbgrid1.Canvas.MoveTo(rect.Left, rect.Top);
dbgrid1.Canvas.LineTo(rect.Right, rect.Bottom);
dbgrid1.Canvas.MoveTo(rect.Left, rect.Bottom);
dbgrid1.Canvas.LineTo(rect.Right, rect.top);
end;
dbgrid1.Canvas.Pen.Color := oldclo;
end
else
begin //在重绘别的字段的时候 用颜色区分 bz的属性
if table1.FieldByName('BZ').AsBoolean = True then
begin
dbgrid1.Canvas.Brush.Color := $00A6E7F7;
end
else
begin
dbgrid1.Canvas.Brush.Color := $00B8BCE4;
end;
dbgrid1.DefaultDrawDataCell(rect, field, state); //在调用dbgrid的DefaultDrawDataCell过程重绘除abc以外的所有字段

end;
end;

 

Similar threads

回复
0
查看
848
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部