TQuery中如何进行点击TDBrid的标题栏就排序?(100分)

  • 主题发起人 主题发起人 Cinway
  • 开始时间 开始时间
C

Cinway

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TQuery进行查询,结果显示在DBGrid中。想实现以下效果,就是
点击了DBGrid的标题栏就进行排序显示,标题栏有多个,怎么办?
TQuery查询的表只有一个索引,而且我用的 TQuery的RequestLive必须为True..
 
用DBGridEh控件,有标题点击事件,自己写排序代码。
ADO方式较简单,效率也高。
BDE方式需从新构造sql语句,再检索一遍。
有兴趣E我:dzhzh2000@yahoo.com
 
在OnTitleClick中写代码,
若为ADO连接,则改写相应的sort串;
若设有Index,则改用相应的Index;
若要对任意字段排序(升&降),则可动态构造SQL,用...ORDER BY ... DESC / ASC。
根据ASC或DESC,还可在当前排序字段的标题栏处显示升、降序(改写Title.Caption)。
 
wwDbGrid
procedure orderbyRec(qry:Tquery;FieldName:string); //分别以不同的字段排序
var
tempsql:string;
begin
tempsql:='';
if pos('Order',qry.sql.text)<>0 then
tempsql:=copy(qry.SQL.text,1,pos('Order',qry.sql.text)-1)
else
tempsql:=qry.sql.text;
with qry do
begin
close;
sql.clear;
sql.add(tempsql+''+'Order by '+Fieldname);
open;
end;
end;

procedure TfrmShRecord.wwDBGrid1TitleButtonClick(Sender: TObject;
AFieldName: String);
begin
orderbyrec(query1,AFieldName)
end;
 
OnTitleClick
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
s:string;
begin
s:='systime';
case Column.Index of
0:s:= 'username';
1:s:= 'systime';
2:s:= 'servername';
3:s:= 'computername';
4:s:='localtime';
end;
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM tablename order by '+s+' desc');
Active:=true;
end;
end;
end;
 
OnTitleClick
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
s:string;
begin
{
s:='systime';
case Column.Index of
0:s:= 'username';
1:s:= 'systime';
2:s:= 'servername';
3:s:= 'computername';
4:s:='localtime';
end;
}
//----------------------
// 改成这样效率更高
s:=Column.FieldName;
//----------------------
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM tablename order by '+s+' desc');
Active:=true;
end;
end;
end;
 
谢谢大家!
 
后退
顶部