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;
可以使用dbgrideh,用footer汇总。 加序号的话可以使用adoquery自己维护的reco来标识,如在adoquery中建一个计算字段,在adoquery的onCalcFields事件中写代码: with DataSet do begin if RecNo < 1 then FieldByName('num').Value := 1 else FieldByName('num').Value := RecNo; end; 试试吧,当然也可以在表里做文章。
经过验证,这个方法是成功的 //聲明全局變量i
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin with DBGrid1.DataSource.DataSet do begin if DataCol = 0 then //設置在第一列 begin if state<>dsInsert then i:= recno; //這句是關鍵 DBGrid1.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, IntToStr(i)); inc(i); //將i加1 end; end; end;
procedure TForm1.DataSource1StateChange(Sender: TObject); begin //狀態改變時將i置為1 i:=1; end;
ADOQuery.SQL.Add('Select identity(Int,1,1) As ID,你的查询字段 into #c From table'); ADOQuery.SQL.Add('Select * From #c Order By ID'); ADOQuery.SQL.Add('Drop Table #c');然后在你的dbgrid中加一个列,设为ID就行了。
我的表中有一个时间字段,时间格式为2005-1-1,
我在查询的时候,想要输入一个时间,并在dbgird控件中显示这些记录, 但是时间控件我不知道如何用(想要时间控件是那种选择式的,可以选的)请指点
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.
加序号的话可以使用adoquery自己维护的reco来标识,如在adoquery中建一个计算字段,在adoquery的onCalcFields事件中写代码:
with DataSet do
begin
if RecNo < 1 then
FieldByName('num').Value := 1
else
FieldByName('num').Value := RecNo;
end;
试试吧,当然也可以在表里做文章。
//聲明全局變量i
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with DBGrid1.DataSource.DataSet do
begin
if DataCol = 0 then //設置在第一列
begin
if state<>dsInsert then i:= recno; //這句是關鍵
DBGrid1.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, IntToStr(i));
inc(i); //將i加1
end;
end;
end;
procedure TForm1.DataSource1StateChange(Sender: TObject);
begin //狀態改變時將i置為1
i:=1;
end;
ADOQuery.SQL.Add('Select * From #c Order By ID');
ADOQuery.SQL.Add('Drop Table #c');然后在你的dbgrid中加一个列,设为ID就行了。