我用Query从数据库中查出相关的记录后,显示在DBGrid中,样式如下:ItemCode Name Quantity Amount
000001 工具A 5 1000
000002 工具B 8 8000
000003 工具C 1 9000
000004 工具D 4 1000
000005 工具E 2 4500查出之后,我现在想重新排一下序,就是按DBGrid中各相应的列头按钮,使其按着所点击的列排序(按一下使其升序,再按一下使用降序,就像Windows中,在文件夹里按文件名排序文件一样)例如: 我按了一下DBGrid中Amount列的列头按钮<Amount>,那么这个DBGrid现在里面的记录就按着Amount来排序,按一下Amount,DBGride就按着Amount升序排列,再按一下就按Amount降序排列,按其它的列头按钮也同样。请问高手,如何才能实现???小弟在此谢过~!!
000001 工具A 5 1000
000002 工具B 8 8000
000003 工具C 1 9000
000004 工具D 4 1000
000005 工具E 2 4500查出之后,我现在想重新排一下序,就是按DBGrid中各相应的列头按钮,使其按着所点击的列排序(按一下使其升序,再按一下使用降序,就像Windows中,在文件夹里按文件名排序文件一样)例如: 我按了一下DBGrid中Amount列的列头按钮<Amount>,那么这个DBGrid现在里面的记录就按着Amount来排序,按一下Amount,DBGride就按着Amount升序排列,再按一下就按Amount降序排列,按其它的列头按钮也同样。请问高手,如何才能实现???小弟在此谢过~!!
begin
if SortStyle=false then
begin
dm.adoqury1.Sort:=Column.FieldName+' ASC';
SortStyle:=true;
end
else
begin
dm.adoqury1.Sort:=Column.FieldName+' DESC';
SortStyle:=false;
end;
end;
ADOQuery1.Sort := 'Amount DESCEND'; // Amount 按降序排列也可以多列排序, 如: 'Name ASCEND, Amount DESCEND'关于记忆升降序的问题就比较简单了, 只要增加一个变量记录排列状态即可, 如: FIsDescend: Boolean; 默认值为 False, 只要按一下就做: FIsDescend := not FIsDescend;若要做得细一点, 则记录 click 列, 当列改变时初始化 FIsDescend := False 即可.
2.你也可以再重新执行一次SQL语句排序吗。
begin
if Boolean then
ADOQuery1.Sort := Column.FieldName + ASC'
else
ADOQuery1.Sort := Column.FieldName + 'DESC';
end;
var
sOrder :String;
begin
if blOrder then
begin
sOrder := 'DESC';
blOrder := False;
end
else
begin
sOrder := '';
blOrder := True;
end; aq1.Sort:=Column.FieldName +' '+sOrder;end;
// 使用说明:单击DBGridEh的标题栏排序(适用于ADO)
// --在DBGridEh的事件OnTitleBtnClick引用该函数即可:
// SortDBGridEh(Sender, ACol, Column);
// --为了保证表格的每一列都能点击触发排序,你需要将你需要排序的列属性
// -- Title->TitleButton设置为True。
//
procedure SortDBGridEh(Sender: TObject; ACol: Integer; Column: TColumnEh);
var
FieldName, SortStr: string;
begin
Screen.Cursor := crSQLWait;
try
if (Sender is TDBGridEh) and
((Sender as TDBGridEh).DataSource.DataSet <> nil) then
begin
if not ((Sender as TDBGridEh).DataSource.DataSet is
TCustomADODataSet) then
Exit;
if not (Sender as TDBGridEh).DataSource.DataSet.Active then
Exit;
FieldName := Column.FieldName;
if (Sender as
TDBGridEh).DataSource.DataSet.FindField(FieldName).IsBlob then
Exit;
if (Sender as
TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
fkData then
SortStr := FieldName
else if (Sender as
TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
fkLookup then
FieldName := (Sender as TDBGridEh).DataSource.DataSet.FieldByName
(FieldName).KeyFields
else
FieldName := '';
if (FieldName = '') or (Pos(';', FieldName) > 0) then
Exit;
case Column.Title.SortMarker of
smNoneEh:
begin
Column.Title.SortMarker := smUpEh;
TCustomADODataSet((Sender as
TDBGridEh).DataSource.DataSet).Sort :=
FieldName;
end;
smUpEh:
begin
Column.Title.SortMarker := smDownEh;
TCustomADODataSet((Sender as
TDBGridEh).DataSource.DataSet).Sort :=
FieldName + ' DESC';
end;
smDownEh:
begin
Column.Title.SortMarker := smNoneEh;
TCustomADODataSet((Sender as
TDBGridEh).DataSource.DataSet).Sort := '';
end;
end;
end;
finally
Screen.Cursor := crDefault;
end;
end;
procedure Tfzaomo.DBGrid1TitleClick(Column: TColumn); //排序
var
i:integer;
fieldname:string;begin
DBGrid1.Columns[0].Title.caption:='aa';
DBGrid1.Columns[1].Title.caption:='bb';
DBGrid1.Columns[2].Title.caption:='cc';
DBGrid1.Columns[3].Title.caption:='dd';
DBGrid1.Columns[4].Title.caption:='ee';
DBGrid1.Columns[5].Title.caption:='ff';
i:=Column.Index;
if bSort then
begin
fieldname:=DBGrid1.Columns[i].FieldName+' ASC';
dbgrid1.Columns[i].Title.Caption:= dbgrid1.Columns[i].Title.Caption+'▲';
bSort:=False;
end
else
begin
fieldname:=DBGrid1.Columns[i].FieldName+' DESC';
dbgrid1.Columns[i].Title.Caption:= dbgrid1.Columns[i].Title.Caption+'▼';
bSort:=True;
end; adoquery1.Sort:=fieldname;
end;可以发分了!