想要这样的Dbgrid...(70分)

  • 主题发起人 主题发起人 fx
  • 开始时间 开始时间
F

fx

Unregistered / Unconfirmed
GUEST, unregistred user!
用两中底色显示数据集中的数据,对某一字段Field排序显示时,若Field的值
相同则显示同一底色,不同则底色相异,达到以Filed的值分类,底色交替显示如斑马线般的效果。
怎么实现呢?有现成的吗?
 
看看rxlib的例子吧!
 
知道Rxlib 吗? 很著名的Free控件库.
 
Rxlib我已安装了。
这个问题不在于如何画出底色来,而是如何根据某一field的值的不同而交替显示出
记录来.我已用建个计算字段的方法实现了这种效果,但应该还有更好的方法,而且
我还想做成个控件,Publish 三个新属性:SortField(分类的字段),DarkColor,LightColor(两种颜色) 就能通用了。
还请高手指点!
 
这种特殊的显示效果建议你自己写,
方法,
1、将DBGrid.DefaultDrawing属性设置为False
2、在DBGrid.OnDrawColumnCell事件中写代码,
自己判断数据状态,绘出不同的显示效果。

又,在OnDrawColumnCell事件中
1、Column.FieldName可得到当前字段名
2、DBGrid.DefaultDrawColumnCell方法调用
DBGrid自己的绘制方法

关于你的问题可以建立两个变量
LastValue保存上一条记录值
LastColor保存上一条记录显示颜色
在显示代码中判断这两个变量就可以了

我觉得不必作成控件,毕竟没什么需求,
一点点代码就搞定了。
 
这问题还是要做成控件好,我现在的项目里就是用 wwDbGrid手工实现这效果
不过感觉不好, 在插入操作和UPDATE记录后,重绘有问题
 
利用两个变量,在onDrawDataCell或OnDrawColumnCell时绘制记录的方法我已试
过,
问题在:当Dbgrid中不规则跳跃记录时,或者隐藏窗体后再显示重绘时底色就会乱变了。其实某一条记录的底色在数据集打开后就已经确定了,仅靠两个变量恐怕是记录不下的。
另外,同意王兄的意见:还是做成控件的好。因为我想在整个程序中都采用这种风格的DBgrid,做成控件很方便。

对于重绘时的问题,不知那位还有好办法?

 
你看看rxlib自带的例子不就完了,里面全有的,连排序都包了。
 
对不起,只是想了解最新情况
 
看了rxlib中的例子也无济于事!
开始用计算字段实现该效果其实用的就是rxlib类似的办法!
想做成控件可能没戏了...
还请高手不吝赐教...
 

你的意思是什么无济于事?
 
我的意思是对于做成控件没有帮助。
rxlib给记录上色是根据已有字段的值而决定底色的颜色的,
而我想要的上色分类并不依赖于字段具体的值,只要区分开就可了。
愿闻menxin兄详述你的想法。
 
fx,你别费神了,这里的人多是理论家
你所说问题看来还要自己解决了
我也想用这种效果,现在因为手里活紧
只好先不用这种效果
我的做法是 : 做了一个两个计算字段,类型: INTEGER, 两个计算字段
分别用来保存当前行的背景色和前景字符颜色
在 DATASET 打开时,从前到后NEXT一遍, 一直到DATASET EOF
在这滚动过程中, 用一变量数值保存欲判断分类的字段内容
根据相同或不同,给当前的计算字段赋予不同的字符颜色


在DATASET DRAWDATACELL 的事件里,根据计算字段的数值决定
当前行的CELL颜色, 大致就是这么做, 我是用 wwDBGrid实现
普通的DBGIRD也是可以的。唯一缺陷就是如果用户做了插入操作或
修改删除操作,我无法刷新DBGRID的显示,如果你需要代码我把
代码MAIL 给你,交流交流
(dataset.close; dataset.Open是可以完成刷新的。
但我实在不愿意重新执行CLOSE OPEN 操作,因为我用SQL SERVER,
为更新显示而重新执行查询很土)

其他各位高人所说的话俺不太同意, 毕竟你们没有做过就不要空发言论
 
寒松兄,你也很费神吗,写了这么多。多谢,多谢!
看了你的方法,我很高兴呀,我目前就是这么做的,真是**所见略同啊!:)
而且我用的时候数据不会更新删除等操作,所以我这没什么缺陷。

这个问题再渗几天吧,也许还有好办法。

 
我试了一下,并不太困难。用了两个全局变量 一个存颜色,一个存上一条的值。
代码如下:

var
Form1: TForm1;
saveprice:Real=-1.00; //设置一初始值
savecolor:Boolean=true;

implementation

{$R *.DFM}
... //画排序的箭头略

procedure TForm1.RxDBGrid1TitleBtnClick(Sender: TObject; ACol: Integer;
Field: TField);
begin
RxQuery1.MacroByName('me').AsString:=Field.FieldName;
if RxQuery1.MacroByName('m2').AsString='' then
RxQuery1.MacroByName('m2').AsString:='desc'
else
RxQuery1.MacroByName('m2').AsString:='';
RxQuery1.close;
RxQuery1.open;
end; //排序

procedure TForm1.RxDBGrid1GetCellParams(Sender: TObject; Field: TField;
AFont: TFont; var Background: TColor; Highlight: Boolean);
begin
if Field.FieldName='Price' then
begin
if (saveprice=-1.00)or(saveprice<>Field.AsFloat) then
begin
saveprice:=field.asfloat;
savecolor:=not savecolor;
end;
if savecolor then Background:=clred else Background:=clblue;
end;
end;

//我这里只对price 进行着色,可根据你的实际情况改动,'Price'注意大小写,这
//是rxlib的弱点之一。

end.
 
to menxin:
其实你的思路和我所说的实现方法原理上是一致的。
但你也许为考虑为什么我们要把颜色数值保存到计算字段里

你自己找一个大点的数据集合实验一下你的例子吧。
一开始的显示肯定没问题, 滚动滚动条到最后,然后在滚动到第一行
看看颜色如何。
 
我很关心这个问题,希望各位大虾踊跃发言
 
多人接受答案了。
 
后退
顶部