DBgridEh 如何根据某字段的值轮换改变行的颜色?

nimeide1234567890 2018-06-24 04:26:18
不是要根据奇偶行轮换改变颜色!

这样一个表,有个字段编号

编号
1001
1001
1002
1002
1002
1002
1003
1003
...

我想在DBgridEh中显示的时候,1001的行颜色用绿色,到了1002就变成蓝色,
到了1003又变回绿色,以此类推,反正就是仅使用两种轮换,请问如何实现,谢谢!
...全文
882 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueStorm 2018-06-27
  • 打赏
  • 举报
回复
在不增加字段的情况下,用一个数组来记录1或0也可以。
BlueStorm 2018-06-27
  • 打赏
  • 举报
回复
事实上不用增加字段也是可以的,用一个变量记录上一个记录的id值,用这个id比对当前的id值,不同的话就标注不同的颜色。
BlueStorm 2018-06-27
  • 打赏
  • 举报
回复
最简单的方法,就是dataset增加一个字段, 在dataset.DisableControl := True的情况下,从第一行开始历遍整个dataset,id相同值的,新增字段的值为设为0, 下一个不同的id,新增字段的值为1,然后下一个不同的id,新增字段的值为0,以此类推。完成后设dataset.DisableControl := false。
然后根据新增字段的值为0或1,在DBGridEh1DrawDataCell标注不同的颜色。
秋天之落叶 2018-06-27
  • 打赏
  • 举报
回复
刚测试了一下,确实有问题,DBGridEh的DrawColumnCell、DrawDataCell、GetCellParams等事件,好像本身就具有遍历功能,而且还是row*Column次记录,类似X MOD 2=0、字段值='A'这样的判断条件具有一定的稳定性,而判断row的Column值是否上下相等是变化的、不稳定的,光标移进表格中就会触发事件驱动,使得事件内的驱动触发行和列的变化,所以设置的颜色也会变来变去,这个方法可能不行。
如果你想要的方法真的很重要,建议还是找一个有规则的列值使用,或者加一个列专门用作涂色判断。
或者,最笨的办法,如果这些编号能穷尽,干脆就穷尽列举。
再看看其他高手还有别的办法解决吗。

nimeide1234567890 2018-06-26
  • 打赏
  • 举报
回复

一会图1,一会变成图2,也就是颜色正好相反的变了,还有离谱的情况是,鼠标在里面点的时候,完全乱了,像图3那样的太乱了
nimeide1234567890 2018-06-26
  • 打赏
  • 举报
回复
nimeide1234567890 2018-06-26
  • 打赏
  • 举报
回复
秋天之落叶 2018-06-26
  • 打赏
  • 举报
回复
怎么不行?提示什么错误?选的什么事件?字段是否替换正确?
不要照搬代码,要自己根据自己的实际情况梳理一下。
另外,你要把基本情况提供一下,要不大家不知道哪里不行啊。
nimeide1234567890 2018-06-26
  • 打赏
  • 举报
回复
还是不行啊。。。。。。。。。。。。。。。
秋天之落叶 2018-06-26
  • 打赏
  • 举报
回复
1.按照编号排序查询
2.定义编号变量
3.ADO编号.first
4.编号变量=编号
5.for ado 循环
6.if 编号变量=编号 then 赋值绿色
if 编号变量<>编号 then 赋值蓝色 and 编号变量=编号
7.next; end for
刚想到的不知道能不能实现,你可以自己试一试哈:
利用for循环,先根据编号值排序,如果下一个编号值不等于上一个编号值,就变颜色,颜色就在蓝绿之间循环。
秋天之落叶 2018-06-26
  • 打赏
  • 举报
回复
还有一个办法就是,不用编号字段,找一个对应编号字段的有规律的其他字段,比较容易一些。
秋天之落叶 2018-06-26
  • 打赏
  • 举报
回复
是啊,你自己定义的编号规则,当然要你自己找规律了,要是没有任何规律,你只能穷举了,谁也也没办法
whb00120012 2018-06-26
  • 打赏
  • 举报
回复

integer lock1;

L0:=DBGridEh1.DataSource.DataSet.FieldByName('字段名').integer;
color1:=clBlack;
for i=1 to row
begin
L:=DBGridEh1.DataSource.DataSet.FieldByName('字段名').integer;
if (L<>L0) THEN
L0=L;
IF LOCK0=0 THEN
BEGIN
LOCK0=1
Color1:=clBlue;
END
IF LOCK0=1 THEN
BEGIN
LOCK0=0
Color1:=clBlack;
END
END IF
DBGridEh1.Canvas.Font.Color:=color1;
DBGridEh1.Canvas.pen.mode:=pmmask;
DBGridEh1.DefaultDrawDataCell(Rect, Field, State);
adoquery1.next
END

nimeide1234567890 2018-06-25
  • 打赏
  • 举报
回复
字段编号不一定是纯数字的,也可能是字母加数字组合
nimeide1234567890 2018-06-25
  • 打赏
  • 举报
回复
都不行啊,看清楚问题描述啊,不是有规律的,有的单据有2行数据,有的单据有3行,4行数据,有的单据有10多行数据
秋天之落叶 2018-06-25
  • 打赏
  • 举报
回复
procedure TForm1.DBGridEh12DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
begin
if dm1.ADO判卷.FieldByName('判卷').AsString = '自动判卷' then
begin
DBGridEh12.Canvas.Font.Color := clGreen;
end
else if dm1.ADO判卷.FieldByName('判卷').AsString = '人工判卷' then
begin
DBGridEh12.Canvas.Font.Color := clMaroon;
end;
DBGridEh12.DefaultDrawColumnCell(Rect, DataCol, Column,
GridsEh.TGridDrawState(State));
end;
没想你的1001...如何找规律,供参考吧,你自己改成='1001'时变绿,='1002'时变蓝。
秋天之落叶 2018-06-25
  • 打赏
  • 举报
回复
引用 1 楼 lyhoo163 的回复:
procedure TMedicalFrm.DBGridEh1DrawDataCell(Sender: TObject;
const Rect: TRect; Field: TField; State: TGridDrawState);
var L:string;
begin
L:=DBGridEh1.DataSource.DataSet.FieldByName('字段名').integer;
if L mod 2=0 then
begin
DBGridEh1.Canvas.Font.Color:=clBlack;
DBGridEh1.Canvas.pen.mode:=pmmask;
DBGridEh1.DefaultDrawDataCell(Rect, Field, State);
end
else begin
DBGridEh1.Canvas.Font.Color:=clBlue;
DBGridEh1.Canvas.pen.mode:=pmmask;
DBGridEh1.DefaultDrawDataCell(Rect, Field, State);
end;
end;

在 DBGridEh1DrawDataCell事件中,加入上述代码即可。

他连续的两行或三行可能是一个编号
lyhoo163 2018-06-24
  • 打赏
  • 举报
回复
procedure TMedicalFrm.DBGridEh1DrawDataCell(Sender: TObject;
const Rect: TRect; Field: TField; State: TGridDrawState);
var L:string;
begin
L:=DBGridEh1.DataSource.DataSet.FieldByName('字段名').integer;
if L mod 2=0 then
begin
DBGridEh1.Canvas.Font.Color:=clBlack;
DBGridEh1.Canvas.pen.mode:=pmmask;
DBGridEh1.DefaultDrawDataCell(Rect, Field, State);
end
else begin
DBGridEh1.Canvas.Font.Color:=clBlue;
DBGridEh1.Canvas.pen.mode:=pmmask;
DBGridEh1.DefaultDrawDataCell(Rect, Field, State);
end;
end;

在 DBGridEh1DrawDataCell事件中,加入上述代码即可。

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧