我是德尔福的新手,我需要一个建议。
我正在使用TMS TDBAdvGrid,我需要在用户单击列标题时对数据进行排序。我设置了网格的排序设置,我为onclicksort事件编写代码,但它无法正常工作。
网格的排序设置:
SortSettings.Show = True;
SortSettings.IgnoreBlanks = True;
SortSettings.BlankPos = blLast;
onclicksort事件:
try
try
if FSortISWorking then
Exit;
FSortISWorking := true;
if ACol < 0 then
begin
grid.BeginUpdate;
grid.SortSettings.Column := ACol;
Application.ProcessMessages;
grid.QSort;
grid.EndUpdate;
end;
except on e: Exception do
begin
// log the error
end;
end;
finally
FSortISWorking := false;
end;
网格未直接链接到数据库。数据被加载到内存(TClientDataSet)中,我只需要在内存中对数据进行排序,而无需对数据库进行另一次查询。
谢谢
答案 0 :(得分:3)
我试过你的例子,这解决了我的问题:
Grid.PageMode := False;
答案 1 :(得分:1)
要解决此问题,您必须在网格后面订购数据集。在这里你有如何做到这一点:http://delphi.about.com/od/usedbvcl/l/aa042203a.htm。
瞧,你有一个例子: procedure TForm1.DBAdvGrid1CanSort(Sender:TObject; ACol: Integer; var DoSort: Boolean);
var fldname:string;
begin
DoSort := False; // disable internal sort
// toggle sort order if
dbadvgrid1.SortSettings.Direction = sdAscending then
dbadvgrid1.SortSettings.Direction := sdDescending else
dbadvgrid1.SortSettings.Direction := sdAscending;
// get field name of the column
clicked fldname :=query1.FieldList.Fields[ACol -1].FieldName;
if pos(' ',fldname) 0 then fldname:= 'biolife.db."'+fldname+'"';
// add ORDER BY clause to the query
query1.SQL.Text := 'select * from
biolife.db ORDER BY '+fldname;
if dbadvgrid1.SortSettings.Direction =
sdDescending then query1.SQL.Text :=
query1.SQL.Text + ' DESC';
query1.Active := true;
DBAdvGrid1.SortSettings.Column := ACol;
end;
如果您想在此处订购clientdataset,您可以了解如何操作:
http://edn.embarcadero.com/article/29056
最好的问候,
拉杜