delphi dbgrid中如何自动生成序号?即在显示的数据前显示1.2.3.4……
5个回答
展开全部
预先在 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;
展开全部
直接通过SQL语句生成序号,不需要在本地去重画控件,如:
select row_number() over(order by id) 序号,姓名..... from ...
查询出来的结果,序号这个字段就是你所要的。
select row_number() over(order by id) 序号,姓名..... from ...
查询出来的结果,序号这个字段就是你所要的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
重新编号保存后不会有多笔同样的编号?
还是说你只是想在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.
还是说你只是想在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.
追问
你好,感谢你的回答,我是想直接在dbgrid中另外生成一个列用来显示序号1.2.3.……你说的三方控件是什么意思?你给我的这些代码我不是很懂啊,能说的清楚些吗?谢谢
追答
你在电脑上测试一下上面的代码。。看是不是你要的效果。。。。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我给你一个思路:
当记录新增后,你计算一下当前数据集中有几条记录,然后在提交之前事件中给这个序列字段赋这个记录数就OK。如:当你新增第二条记录后,当前数据集中的记录数量是2,则你提交前事件中给这个序号字段赋值为2。
当记录新增后,你计算一下当前数据集中有几条记录,然后在提交之前事件中给这个序列字段赋这个记录数就OK。如:当你新增第二条记录后,当前数据集中的记录数量是2,则你提交前事件中给这个序号字段赋值为2。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在写sql语句的时候就把序号弄成一个字段啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询