我用的数据库是oracle,通过query 查询后的数据在dbgrid中显示出来后,要求在最左边加一序号列。

解决方案 »

  1.   

    建一人计算字段,对计算字段赋值  计算字段.value = DBGrid对应数据控件.rowno
      

  2.   

    http://my.houhai.com/article.php?tid=837
    比较笨的办法
      

  3.   

    不明白楼主为什么不结贴,继续期待
    http://community.csdn.net/Expert/topic/5361/5361826.xml?temp=.9655573
      

  4.   

    lihuasoft(学习低调做人),老兄,俺穷啊,再宽限几日吧,呵呵!!!
      

  5.   

    lihuasoft,哥们我已经结贴了,赶快给答案吧
      

  6.   

    希望你保持这个好习惯。至少在本贴保持。方案一:原作者:sanmaotuo老冯预先设计一个column的title为'序号'procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
       if DataSource1.DataSet.RecNo > 0 then
      begin
        if WideUpperCase(Column.Title.Caption) = '序号' then
          DBGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top, IntToStr(DataSource1.DataSet.RecNo));
      end;
    end;--------------------------------方案二:原作者:hongxing_dl这是用Table做的演示,你看懂后,自己改成Queryunit Unit1; interface uses 
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
      Grids, DBGrids, StdCtrls, Buttons, Db, DBTables, ExtCtrls, jpeg; const ROWCNT=20; type 
      tmygrid=class(tdbgrid) 
        protected 
          procedure Paint;override; 
          procedure DrawCell(ACol:Integer;ARow:Integer;ARect:TRect;AState:TGridDrawState);override; 
        public 
          constructor create(AOwner:TComponent);override; 
          destructor destroy;override; 
      end;   TForm1 = class(TForm) 
        BitBtn1: TBitBtn; 
        DataSource1: TDataSource; 
        Table1: TTable; 
        procedure BitBtn1Click(Sender: TObject); 
        private 
          { Private declarations } 
        public 
          { Public declarations } 
      end; var 
      Form1: TForm1; 
      mygrid:tmygrid; implementation {$R *.DFM} {tmygrid} 
    constructor tmygrid.create(AOwner:TComponent); 
    begin 
      inherited create(Owner); 
      RowCount:=ROWCNT; 
    end; destructor tmygrid.destroy; 
    begin 
      inherited; 
    end; procedure tmygrid.Paint; 
    begin 
      RowCount:=ROWCNT; 
      if dgIndicator in options then 
         ColWidths[0]:=30; 
      inherited; 
    end; procedure tmygrid.DrawCell(ACol:Integer;ARow:Integer;ARect:TRect;AState:TGridDrawState); 
    begin 
      inherited; 
      if (ARow>=1) and (ACol=0) then 
         Canvas.TextRect(ARect,ARect.Left,ARect.Top,IntToSTr(ARow)); 
    end; procedure TForm1.BitBtn1Click(Sender: TObject); 
    begin 
      mygrid:=tmygrid.create(Self); 
      mygrid.parent:=self; 
      mygrid.left:=0; 
      mygrid.top:=0; 
      mygrid.Height:=300; 
      mygrid.DataSource:=DataSource1; 
    end; end. ----------------------------------------方案三:用SQL查询语句实现。数据库为ACCESS,有主键字段“ID”,数据源为Query试验通过。:
    sql.Add('Select (Select count(*) from 表名 where id <= a.id and (id >= 100)) , * from 表名 a where (id >= 100) order by id');
    oracle数据库,我没有条件测试。
      

  7.   

    我按照第一种方法试过了,只显示序号这一列,还是空的。原来的在dbgrid中显示的几个字段的内容不见了啊?
      

  8.   

    第一种方案的扩充代码(帮你测试用):窗体上放一个DataSource1、Query1、DBGrid1、Button1暂不要设置DBGrid1的DataSource属性。其他属性你自己设置。把DBGrid1预先设计好的Columns全部清除掉(前面让你设计一个序号列,并没有说让你只设计一个列;下面用代码帮你设计了。)
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I : integer;
    begin
      Query1.Close;
      Query1.SQL.Text := 'select * from animals';//换成你自己的查询语句
      Query1.Open;
      for I := 0 to Query1.FieldCount-1 do
        DBGrid1.Columns.Add;
      DBGrid1.Columns[0].Title.caption := '序号';
      for I := 1 to Query1.FieldCount-1 do
        DBGrid1.Columns[I].Field := Query1.Fields[I-1];  DBGrid1.DataSource := DataSource1;
    end;procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
       if DataSource1.DataSet.RecNo > 0 then
      begin
        if WideUpperCase(Column.Title.Caption) = '序号' then
          DBGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top, IntToStr(DataSource1.DataSet.RecNo));
      end;
    end;
      

  9.   

    老兄,序号这一列怎么是空的? DBGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top, IntToStr(DataSource1.DataSet.RecNo));好像没有起作用啊!其他列的数据可以显示了。我的qq是:37306324
      

  10.   

    有一点小小的遗漏(会不显示最末一个字段),改成下面这样:......  for I := 0 to Query1.FieldCount do
        DBGrid1.Columns.Add;
      DBGrid1.Columns[0].Title.caption := '序号';
      for I := 1 to Query1.FieldCount do
        DBGrid1.Columns[I].Field := Query1.Fields[I-1];......
      

  11.   

    序号这一列怎么是空的? 
    -------------------
    你的DBGrid1DrawColumnCell事件,你让它起作用了吗???------点击对象管理器,双击DrawColumnCell一下!
      

  12.   

    procedure TForm1.DBGrid7DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
     if DataSource7.DataSet.RecNo > 0 then
      begin
        if WideUpperCase(Column.Title.Caption) = '序号' then
           DBGrid7.Canvas.TextOut(Rect.Left+2, Rect.Top, IntToStr(datasource7.DataSet.RecNo));
      end;end;
    我是这么做的啊
      

  13.   

    不是仅仅把代码复制过去就行了,你还要把这个过程与DBGrid的相应事件“挂钩”。也就是说:点击对象管理器,双击DrawColumnCell一下!
    也就是说:  DBGrid1.OnDrawColumnCell := DBGrid1DrawColumnCell;
      

  14.   

    这个我明白,我是双击OnDrawColumnCell后,在这个事件里输入的代码,运行后,序号列确实是空白的!
      

  15.   

    这样吧,兄弟,你新建一个空白工程,把下面的代码复制到你的单元里去:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        Button1: TButton;
        DataSource1: TDataSource;
        Query1: TQuery;
        procedure Button1Click(Sender: TObject);
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      I : integer;
    begin
      Query1.Close;
      Query1.SQL.Text := 'select * from animals';//换成你自己的查询语句
      Query1.Open;
      for I := 0 to Query1.FieldCount do
        DBGrid1.Columns.Add;
      DBGrid1.Columns[0].Title.caption := '序号';
      for I := 1 to Query1.FieldCount do
        DBGrid1.Columns[I].Field := Query1.Fields[I-1];  DBGrid1.DataSource := DataSource1;
    end;procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
       if DataSource1.DataSet.RecNo > 0 then
      begin
        if WideUpperCase(Column.Title.Caption) = '序号' then
          DBGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top, IntToStr(DataSource1.DataSet.RecNo));
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      DBGrid1.OnDrawColumnCell := DBGrid1DrawColumnCell;
      Query1.DatabaseName := 'DBDEMOS';
      DataSource1.DataSet := Query1;
    end;end.我这是用Delphi自带的DBDEMOS数据源试验的,Query与什么数据库基本无关。
      

  16.   

    select rownum as 序号,....
      

  17.   

    你再试一下我的方案二和方案三吧。ByeBye附:DBGrid/DataSource都排到7了,有点惊人。
      

  18.   

    估计“学xx到xxxx,包教包会!”这样的培训机构都没有我在本贴付出的努力多。
      

  19.   

    理论上,Query的RecNo,与数据库是没有关系的。不过我没有试过Oracle数据库。你可以用我的示例代码先测试一下,再换用到Oracle数据库上。
      

  20.   

    呵呵,谢谢lihuasoft,大家非常需要你,你还要继续努力啊哥们!怪不得大家都说csdn是个好地方呢,都是因为你们这些高手的存在。
      

  21.   

    你不是用oracle吗,peterluolaw(木瓜)兄的方法最方便。 就用rownum。
      

  22.   

    lihuasoft(坐井观天)  你提供的例子 為什么用這句Dbgrid1.columns.add 時總是報錯呢
      

  23.   

    [Error] Unit1.pas(40): Statement expected, but expression of type 'TColumn' found
    [Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'這樣的提示