起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: liubin

【搞定】DataGridCustomDrawCell事件**

[复制链接]
发表于 2007-9-18 09:10:52 | 显示全部楼层
if  DataGrid.GroupColumnCount>0 then
         jsdialogs.ShowMsg('有分组了','');
回复 支持 反对

使用道具 举报

发表于 2007-9-18 09:34:00 | 显示全部楼层
if (ASelected or AFocused) then   3楼的意思 我理解是点中的数据才会变色,
对呀。如果你不需要,那么取消这个判断。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-18 11:20:42 | 显示全部楼层
to :lixy   用11楼的方法 分组时不变色 不分组时变色已经解决.  现在能不能分组时不乱变色呢?如1,2楼的图片? 有什么方法吗?
回复 支持 反对

使用道具 举报

发表于 2007-9-18 11:39:46 | 显示全部楼层
怪了,帖子上已经很明白了,怎么还不对呢? if (ASelected or AFocused) then  是点中的数据才会变色,如果不是这样,取消这层的判断就可以了。我这里都实现ok了,你那边怎么还是不行呢,你设置断点跟踪了吗?是根据你的意愿在执行呢
附件是效果图

代码,参考如下
procedure TMainForm.DataGrid1CustomDrawCell(Sender: TObject; ACanvas: TCanvas; ARect: TRect; ANode: TTreeListNode; AColumn: TTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean; var AText: string; var AColor: Integer; AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean);
var
  I: Integer;
begin
  //if ASelected or AFocused then
  //  exit ;
  //ACanvas.Font.Color := clBlack;
//原来根据某个字段值来设定颜色的方法,在分组后由于界面刷新机制的问题,就会乱套。所以改为判断Grid的某列的值来设定
  for I := 0 to DataGrid1.ColumnCount - 1 do
  begin
//循环取列找到相应的项(由于列允许移动位置和分组,所以不能固定),并判断其值
    if (DataGrid1.Columns[I].FieldName = 'parent') and
    (SysUtils.trim(ANode.Strings[I]) = '01') then
    begin
      AColor := Graphics.clRed;
      Break;
    end;
  end;
end;

1.gif

5.7 KB, 下载次数: 455

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-18 13:34:10 | 显示全部楼层
现在的问题是:如1楼的图,只有1条记录为红色,在分组后点中这条红色的记录,所以记录都红色了,不知道斑竹是怎么理解的吗?
回复 支持 反对

使用道具 举报

发表于 2007-9-18 13:46:46 | 显示全部楼层
分组的时候,你看看你的索引变成了什么,程序肯定在分组的时候计算的不合乎你的要求了,所以都变红色了。可以想用一个临时字段填充一下索引。看看值的变化。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-18 14:18:31 | 显示全部楼层
不明白索引在看啊,  基于1,2楼的图片,您给写个例子吧
回复 支持 反对

使用道具 举报

发表于 2007-9-18 14:49:09 | 显示全部楼层
ANode.Index  你看看这个值在分组后是不是有什么变化?
回复 支持 反对

使用道具 举报

发表于 2007-9-18 14:55:47 | 显示全部楼层
3楼已经给你提示了:
No.1  DataGrid在分组后CustomDrallCell中的表现问题

此问题发现是一个共性
在DataGrid的OnCustomDrawCell中的代码按如下方法修改:
procedure TMainForm.DataGrid1CustomDrawCell(Sender: TObject; ACanvas: TCanvas; ARect: TRect; ANode: TTreeListNode; AColumn: TTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean; var AText: string; var AColor: Integer; AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean);
var
  I: Integer;
begin
  if ASelected or AFocused then
    exit ;
  ACanvas.Font.Color := clBlack;
//原来根据某个字段值来设定颜色的方法,在分组后由于界面刷新机制的问题,就会乱套。所以改为判断Grid的某列的值来设定
  for I := 0 to DataGrid1.ColumnCount - 1 do
  begin
//循环取列找到相应的项(由于列允许移动位置和分组,所以不能固定),并判断其值
    if (DataGrid1.Columns[I].FieldName = 'PROVIENCE') and
    (SysUtils.trim(ANode.Strings[I]) = '北京') then
    begin
      AColor := clRed;
      Break;
    end;
  end;
end;

广告秀
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-18 17:12:25 | 显示全部楼层
Ok ,明白了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-28 05:10 , Processed in 0.042337 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表