procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with DBGrid1 do
  begin
   if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then
begin 
Canvas.Font.Color :=ClYellow; 
Canvas.Brush.Color :=ClNavy;
end 
else 
begin
    if DBGrid1.DataSource.DataSet.RecNo mod 2 <> 0 then
        Canvas.brush.Color :=clRed {如果是奇数行,DBGrid背景以红色显示}
    else
       Canvas.brush.Color :=$00EAEAEA {如果是偶数行,DBGrid背景以浅灰色显示}
    end;
      DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;end;
另外看Delphi6 的帮助文件DataSet 还有个CurrentRecord:integer 属性!
可是在IDE里根本找不到。
这又是什么原因呢?

解决方案 »

  1.   

    确实有这个问题!如果你不愿意改写控件和使用第三方控件的话,可以考虑使用TStringGrid,虽然写代码多些,但容易控制。
      

  2.   

    我刚刚查出 CurrentRecord 
    是Protected 级的属性!但没有子类去实现它.
    所以没有办法了,就算想点办法能访问到它也没有什么用,那只有一个-1
      

  3.   

    DataSet.first;
    DataSet.last;
    再取DataSet.RecNo试一下
      

  4.   

    ehlib,dbgrideh就不会有这个问题我一直在使用
      

  5.   

    DataSet 把它的CurType设置成静态的试试..就那几个参数可以一试....
      

  6.   

    procedure TMainForm.DBGrid1DrawColumnCell(Sender: TObject;
    const Rect: TRect; DataCol: Integer; Column: TColumn;
    State: TGridDrawState);
    var i :integer;
    begin
    if gdSelected in State then Exit;//定义表头的字体和背景颜色:
    for i :=0 to (Sender as TDBGrid).Columns.Count-1 do
    begin
    (Sender as TDBGrid).Columns[i].Title.Font.Name :='宋体'; //字体
    (Sender as TDBGrid).Columns[i].Title.Font.Size :=9; //字体大小
    (Sender as TDBGrid).Columns[i].Title.Font.Color :=$000000ff; //字体颜色(红色)
    (Sender as TDBGrid).Columns[i].Title.Color :=$0000ff00; //背景色(绿色)
    end;//隔行改变网格背景色:
    if Query1.RecNo mod 2 = 0 then
    (Sender as TDBGrid).Canvas.Brush.Color := clInfoBk //定义背景颜色
    else
    (Sender as TDBGrid).Canvas.Brush.Color := RGB(191, 255, 223); //定义背景颜色//定义网格线的颜色:
    DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
    with (Sender as TDBGrid).Canvas do //画 cell 的边框
    begin
    Pen.Color := $00ff0000; //定义画笔颜色(蓝色)
    MoveTo(Rect.Left, Rect.Bottom); //画笔定位
    LineTo(Rect.Right, Rect.Bottom); //画蓝色的横线
    Pen.Color := $0000ff00; //定义画笔颜色(绿色)
    MoveTo(Rect.Right, Rect.Top); //画笔定位
    LineTo(Rect.Right, Rect.Bottom); //画绿色的竖线
    end;
    end;
      

  7.   

    谢谢你的热情
    不过你回答的这些我都知道的,
    我的问题是你的Query1.RecNo :
    会不准的。这种情况下。Query1.RecNo = -1
    你的结果是所有的网格显示的颜色都一样的。 
    不论怎么样!谢谢你的热情
      

  8.   

    recno 只能返回local database example:foxpro,paradox,dbase,access
          对于remote database server 无能为力
      

  9.   

    DataSet.RecNo对paradox可用,对SqlServer无效
      

  10.   

    我觉得可以行的,那时侯我用的Delphi5,实在不行多打补丁
      

  11.   

    1、RecNo为-1,TQuery、TTable确实有这个问题,如果方便的话换成TADOQuery、TADOTable,基本上不用改源代码。
    2、CurrentRecord为Propected属性,确实不能直接使用,但是变通一下还是可以的:
    ①在你需要使用的单元里声明一个新类,譬如说TMyDataSet:
    type TMyDataSet = class(TTable);//假设从TTable继承,换成其他DataSet也可
    ②直接引用:
    TMyDataSet(Table1).CurrentRecord   //假设由一个Table1表
      

  12.   

    贴句代码给你参考:procedure TOpenExpDlg.grdTradeDecGetCellColor(Sender: TObject; ACol,
      ARow: Longint; AState: TGridDrawState; ABrush: TBrush; AFont: TFont;
      var Highlight: Boolean);
    begin
      if HighLight then
      begin
        HighLight := False;
        ABrush.Color := clSelectedColor;
      end;
      with grdTradeDec.Fields[ACol], AFont do
        case Tag of
          1: Color := clMaroon;
          2: Color := clGreen;
          3: Color := clOlive;
          4: Color := clNavy;
          5: Color := clPurple;
          6: Color := clTeal;
          7: Color := clGray;
          8: Color := clSilver;
        end;
    end;
      

  13.   

    奇怪?我用的是d7+sqlsever2k,query1.recno没有问题,且在三层下也正常.
    看来诸位说的也不会假的,为什么?不稳定!?