不使用ReNo赋值,用一个变量
设初始值
i:=1
在oncalcfields中写i=i+1;
试一下

解决方案 »

  1.   

    可以用以下程序:从TCustomDBGrid继承一个类:  TMyDBGrid = class(TCustomDBGrid)
      protected
        procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
        procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
      public
        ColNo: Integer;//显示序号的列号
        RecNo: Integer;//第一可见行行号
      end;然后,比如点击某Button进行查询:procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      Column: TColumn;
    begin
      for I := MyDBGrid.Columns.Count - 1 downto 0 do MyDBGrid.Columns[I].Free;
      Query1.Open;
      Column := TColumn.Create(MyDBGrid.Columns);
      Column.Title.Caption := '序号';
      MyDBGrid.ColNo := 1;
      MyDBGrid.RecNo := 0;
      for I := 0 to Query1.FieldCount - 1 do begin
        Column := TColumn.Create(MyDBGrid.Columns);
        Column.Field := Query1.Fields[I];
      end;
    end;在DrawCell里显示序号:procedure TMyDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
    var
      s: String;
      R: TRect;
    begin
      inherited;
      if DataSource.DataSet.Active and (ACol = ColNo) and (ARow > 0) then begin
        s := IntToStr(RecNo + ARow);
        R := ARect;
        InflateRect(R, -2, -2);
        DrawText(Canvas.Handle, PChar(s), Length(s), R, DT_RIGHT)
      end;
    end;难点在于控制第一可见行的行号:procedure TMyDBGrid.WMVScroll(var Message: TWMVScroll);
    begin
      inherited;
      with Message do
        case ScrollCode of
            SB_LINEUP: Dec(RecNo);
            SB_LINEDOWN: Inc(RecNo);
            SB_PAGEUP: Dec(RecNo, VisibleRowCount);
            SB_PAGEDOWN: Inc(RecNo, VisibleRowCount);
            SB_THUMBPOSITION:
              case Pos of
                0: RecNo := 0;
                1: Dec(RecNo, VisibleRowCount);
                2: Exit;
                3: Inc(RecNo, VisibleRowCount);
                4: RecNo := DataSource.DataSet.RecordCount;
              end;
            SB_BOTTOM: RecNo := DataSource.DataSet.RecordCount;
            SB_TOP: RecNo := 0;
        end;
      if RecNo < 0 then RecNo := 0;
      if RecNo > DataSource.DataSet.RecordCount - VisibleRowCount then
        RecNo := DataSource.DataSet.RecordCount - VisibleRowCount;
      Refresh;
    end;
      

  2.   

    procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
      Field: TField; State: TGridDrawState);
    begin
    i_Count:=i_Count+1;//  i_Count 是整形的全局变量,在查询时将它设为0
    if field=adoquery1.FieldByName('新增字段名') then
       dbgrid1.Canvas.TextOut(rect.Left,rect.Top,i_Count);
              
    end;
      

  3.   

    其實用StringGrid好多了, 你想干甚麼就干甚麼;DbGrid有點不太好
      

  4.   

    首先定义一个全局变量 var i: Integer;并在外部赋初值 i:=1;在 DataSet 中增加一个整形计算字段如 No,DataSet 的 OnCalcFields 事件中加入与下代码:With DataSet do 
    begin
         FieldByName('No').asInteger:=i;
         i:=i+1;
    end;在 DBGrid 中引用 No 字段就可以了。
      

  5.   

    To cg1120(代码最优化-§人在爱情的空窗期要个梦§) 
       哪要这么麻烦,您直接从Tdbgrid继承一个类,就可以访问它的row属性.这可能是最简单的方法.
      

  6.   

    过几天考试完了写一个DBgrid的控件.准备解决如下问题:
    给它加一个行号.
    嘻嘻,其实方法很简单.哪位老兄如果愿意的话一分钟就可以写出来.
    Trdbgrid=class(Tdbgrid)
    published
      property  row;
    end;
    =================================================================
    就这么几行代码,您就可以通过row属性来让dbgrid多增加很多功能.
    比如让它每隔两行显示的背景色不同,显示行号之类等等.
    =======================Try======================================
      

  7.   

    =================这也是一种方法,参考jiangtao的=====================
    解决方法:
      1.为dbgrid的Columns定义一个新Column,不要加FieldName,把行号的Column放在第一列
      2.为dbgrid加一个事件,如下:procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var
    RowHeight,Row,Col:INteger;
    begin
    RowHeight := Rect.Bottom - Rect.Top;
      Row := (Rect.Top div RowHeight) - 1;
      if datacol=0 then  //定义行号列
      (Sender as TDBGrid).Canvas.TextOut(Rect.Left, Rect.Top, IntToStr(Row));
    end;
      

  8.   

    我覆盖了Wm_Vscroll 消息的函数,但不知道如何让滚动条滚动,而数据指针不动