delphi dbgrid中如何自动生成序号?即在显示的数据前显示1.2.3.4……

2024-12-13 13:39:22
推荐回答(5个)
回答(1):

预先在 DBGrid 加一列,Title为 “ID”。然后:在事件中添加“DBGridDisplayDrawColumnCell”参考我的内容自己改吧!我也是看别人的,实现了!


procedure TForm1.DBGridDisplayDrawColumnCell(Sender: TObject;

  const Rect: TRect; DataCol: Integer; Column: TColumn;

  State: TGridDrawState);

begin

    if (DataSource.DataSet.RecNo <> 0)  then

       if ( UpperCase(Column.Title.Caption) = 'ID' )   then

            DBGridDisplay.Canvas.TextOut(Rect.Left + 4, Rect.Top + 2, IntToStr(DataSource.DataSet.RecNo));

end;

回答(2):

直接通过SQL语句生成序号,不需要在本地去重画控件,如:
select row_number() over(order by id) 序号,姓名..... from ...

查询出来的结果,序号这个字段就是你所要的。

回答(3):

重新编号保存后不会有多笔同样的编号?
还是说你只是想在dbgride 上显示? 只想在dbgride 上显示好像有一个三方控件。。
好像也有代码的。
var
Form1: TForm1;
i:integer;
bflag,bflag2:boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
adoquery1.Open;
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
rect1:TRect;
sValue :string;
ss:boolean;
begin
if DataCol = 0 then //设置在第一列
begin
if DBGrid1.DataSource.DataSet.state<>dsInsert then
i:= DBGrid1.DataSource.DataSet.recno;

Rect1 := Rect;
with dbgrid1 do
begin
Canvas.Brush.Color := clBtnFace;
sValue := IntToStr(i);
Canvas.FillRect(Rect1);
Canvas.Pen.Width := 1;
Canvas.Pen.Color := clWhite;
Canvas.MoveTo(Rect1.Left, Rect1.Bottom);
Canvas.LineTo(Rect1.Left, Rect1.Top);
Canvas.LineTo(Rect1.right, Rect1.Top);
Canvas.Pen.Color := clBtnShadow;
Canvas.LineTo(Rect1.right, Rect1.Bottom - 1);
Canvas.LineTo(Rect1.Left, Rect1.Bottom - 1);
Rect1.Top := Rect1.Top +1;
if State = [gdSelected, gdFocused] then
begin
if bflag=true then
begin
sValue:=inttostr(datasource.DataSet.RecordCount +1);
i:=datasource.DataSet.RecordCount +1;
ss:=true;
end;
Canvas.Font.Color := clred;
end
else
begin
Canvas.Font.Color := clgreen;
end;
DrawText(Canvas.Handle, PChar(sValue), Length(sValue), Rect1, DT_CENTER);
end;
if i<=dbgrid1.DataSource.DataSet.RecordCount then
begin
inc(i);
end
else
begin
if (ss<>true) then
i:=dbgrid1.DataSource.DataSet.RecordCount+3 -TDrawGrid(DBgrid1).RowCount ;
end;
end
else bflag2:=false;
end;

procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
if dbgrid1.DataSource.DataSet.State <>dsbrowse then
begin
i:=dbgrid1.DataSource.DataSet.RecordCount+3 -TDrawGrid(DBgrid1).RowCount ;
bflag := true;
end
else
bflag:=false;
end;

procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
if (bflag=true)and (dbgrid1.SelectedField.FieldNo <>1) then
begin
i:=dbgrid1.DataSource.DataSet.RecordCount+3 -TDrawGrid(DBgrid1).RowCount;
dbgrid1.Refresh;
end;
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
if (bflag=true)and (dbgrid1.SelectedField.FieldNo =1) then
begin
i:=dbgrid1.DataSource.DataSet.RecordCount+1;
dbgrid1.Refresh;
end;
end;

end.

回答(4):

我给你一个思路:
当记录新增后,你计算一下当前数据集中有几条记录,然后在提交之前事件中给这个序列字段赋这个记录数就OK。如:当你新增第二条记录后,当前数据集中的记录数量是2,则你提交前事件中给这个序号字段赋值为2。

回答(5):

在写sql语句的时候就把序号弄成一个字段啊