怎样给DbGrid加上行号,行号要自动生成,随记录的增减自动调整,
从1开始的连续不间断整数。我用的是adoquery,请高手指点,关键
问题是在增加的时候要自动的加上行号,这方面难度很大,我先出
100分,等问题解决后再出200分,决不失言!!!!看好这300分的高
手来出帮小弟一下吧!!!

解决方案 »

  1.   

    有个笨办法,我刚看了想的,没做过!
    假设现在有100行记录,其中现在删除了30,51,79这三行!
    当删除(afterdelete)这三行的每行时,用一个临时表(tempDelete)把它的行号记录下来,然后在新增加记录的时候去tempDelete找出一个最小的行号,当这条记录(AfterPost)后,从tempDelete
    表中删除这条相应的记录。
    当新增加记录时tempDelete表中没记录时,说明没有从中间删除过数据,这样就取当前表的最大行号加1就可以了!
    我想应该是可以的,代码写起来也不麻烦!你试试看吧,不行再发消息给我!
      

  2.   

    我試過了可以達到你的要求,具體做法:
    1:ADOQuery建立連接,編寫SQL語句;  (這點我就不說了吧)
    2:為ADOQuery中的檢索字段建立永久性字段;//雙擊ADOQUERY,彈出框,右鍵,Add All Fields
    3:再在永久性字段中建立一計算字段,在此我們假定為RecordNo;//右鍵,New Fields,Type:Integer,Field Type:Calculated
    4:在ADOQuery的OnCalcFields事件中編寫代碼:
        ADOQuery1.FieldByName('RecordNo').AsInteger := ADOQuery1.RecNo;至此完成
      

  3.   

    这样行吗?!在表里设一字段来记录行号!在SQL里给他编号!增加或者删除了以后再编一次procedure TFrm_Main.Button7Click(Sender: TObject);
    var
      i:integer;
      s:string;
    begin
      with Frm_data.ADOQuery do
        begin
          Close;
          SQL.Clear;
          SQL.Add('Select * from user_info where user_identity=:t1');
          Parameters[0].Value:='学生';
          Open;
          i:=200;
          while not eof do
            begin
            s:=FieldByName('Id').AsString;
              with Frm_data.ADOQuery1 do
                begin
                  Close;
                  SQL.Clear;
                  SQL.Add('Update User_info set User_code=:t1 where Id=:t2');
                  Parameters[0].Value:=IntToStr(i);
                  Parameters[1].Value:=S;
                  ExecSQL;
                end;
              i:=i+1;
              Next;
            end;
        end;
    end;
      

  4.   

    我刚才的话是对 Bes96261(秋水孤鶩) 老兄说的:)
    突然有人插队了:)
      

  5.   

    to  Bes96261(秋水孤鶩) 
      
      老兄你能看清我问题吗,我关键是新增时也要显示行,你这种做好在浏览里是可以的,但到
    新增时会全部变为-1,我试过好几次了
      

  6.   

    如果该字段没有在数据库存在,行不行,大家发言,这是DELPHI的一个BUG!!!!
    大家发言!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  7.   

    procedure TForm1.qryDataBeforeDelete(DataSet: TDataSet);
    begin
      with qryTool do
      begin
        Close;
        SQL.Clear;
        SQL.Add('insert into delete1 values ('''+IntToStr(qryData.FieldByName('ID').AsInteger)+''')');
        Execsql;
      end;
    end;procedure TForm1.qryDataNewRecord(DataSet: TDataSet);
    begin
      with qryTool do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select min(ID) as id from delete1');
        SQL.Add('where id <> "0"');
        Open;
      end;
      if qryTool.FieldByName('ID').AsInteger <> 0 then
      begin
        qryDataId.AsInteger := qryTool.FieldByName('ID').AsInteger;
        qryDataName.AsString := '';
      end
      else
      begin
        with qryTool do
        begin
          Close;
          SQL.Clear;
          SQL.Add('select max(ID) as id from id ');
          Open;
        end;
        qryDataId.AsInteger := qryTool.FieldByName('ID').AsInteger + 1;
        qryDataName.AsString := '';
      end;
      edtName.SetFocus;
    end;procedure TForm1.qryDataBeforePost(DataSet: TDataSet);
    begin
      with qryTool do
      begin
        Close;
        SQL.Clear;
        SQL.Add('delete from delete1');
        SQL.Add('where ID = '''+IntToStr(qryData.FieldByName('ID').AsInteger)+'''');
        Execsql;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      qryData.Open;
    end;最简单的,调试通过了!
    所有代码都在这了!
    你的信箱我把邮件发给你就是