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

因为从数据库中刷选的数据中不是连续的。想重新为他们编号,想直接用dbgrid实现。求高手指点... 因为从数据库中刷选的数据中不是连续的。想重新为他们编号,想直接用dbgrid实现。求高手指点 展开
 我来答
zhupengfeihaha
2013-03-20
知道答主
回答量:17
采纳率:100%
帮助的人:16.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;

百度网友ba90a0f
2012-04-17 · 超过41用户采纳过TA的回答
知道小有建树答主
回答量:111
采纳率:0%
帮助的人:61.2万
展开全部
直接通过SQL语句生成序号,不需要在本地去重画控件,如:
select row_number() over(order by id) 序号,姓名..... from ...

查询出来的结果,序号这个字段就是你所要的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ymx_0319
2012-04-07 · TA获得超过142个赞
知道答主
回答量:92
采纳率:0%
帮助的人:38.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.
追问
你好,感谢你的回答,我是想直接在dbgrid中另外生成一个列用来显示序号1.2.3.……你说的三方控件是什么意思?你给我的这些代码我不是很懂啊,能说的清楚些吗?谢谢
追答
你在电脑上测试一下上面的代码。。看是不是你要的效果。。。。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zkyEric
2012-04-08
知道答主
回答量:24
采纳率:0%
帮助的人:21.5万
展开全部
我给你一个思路:
当记录新增后,你计算一下当前数据集中有几条记录,然后在提交之前事件中给这个序列字段赋这个记录数就OK。如:当你新增第二条记录后,当前数据集中的记录数量是2,则你提交前事件中给这个序号字段赋值为2。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lin257257
2012-04-16 · TA获得超过424个赞
知道小有建树答主
回答量:331
采纳率:100%
帮助的人:180万
展开全部
在写sql语句的时候就把序号弄成一个字段啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式