我有一个将数据提供给网格的FDQuery 当用户点击列时,我希望网格在该列上排序。 因为我希望能够对多列进行排序,所以我无法使用网格的自动排序选项。
我在我的概念证明中尝试了以下代码。 但它不起作用。
procedure TForm31.JvDBGrid1TitleBtnClick(Sender: TObject; ACol: Integer;
Field: TField);
const
sDesc = 1;
sASC = 2;
sNone = 0;
var
i: integer;
SortClause: string;
AField: TField;
AIndex: TFDIndex;
begin
case Field.Tag of
sDesc: Field.Tag:= sASC;
sASC: Field.Tag:= sNone;
sNone: Field.Tag:= sDesc;
end;
SortClause:= '';
FDQuery1.Indexes.BeginUpdate;
try
FDQuery1.Indexes.Clear;
for i:= 0 to JvDBGrid1.Columns.Count - 1 do begin
AField:= JvDBGrid1.Columns[i].Field;
if AField.Tag <> sNone then begin
AIndex:= FDQuery1.Indexes.Add;
AIndex.Name:= AField.FieldName;
AIndex.Fields:= AField.FieldName;
//AIndex.Options:= [soNoCase, soNullFirst, soDescNullLast, soDescending, soUnique, soPrimary, soNoSymbols]
case AField.Tag of
sDESC: AIndex.Options:= [soDescNullLast];
sASC: AIndex.Options:= [];
end;
AIndex.Active:= true;
end;
end;
finally
FDQuery1.Indexes.EndUpdate;
FDQuery1.Refresh;
end;
end;
Query是否已经有order by
子句并不重要。
我做错了什么?
P.S。我宁愿不采用构建自定义order by
条款,但我知道这是一个选项。
答案 0 :(得分:3)
我认为您可能错过了一个步骤,即将FDQuery的IndexName设置为添加的索引的名称。显然。设置添加的索引的Active属性是不够的。
以下对我来说对MS Sql Server pubs数据库作者表格很好:
procedure TForm1.AddFDIndex;
var
AIndex : TFDIndex;
begin
AIndex := FDQuery1.Indexes.Add;
AIndex.Name := 'ByCityThenlname';
AIndex.Fields := 'city;au_lname';
AIndex.Active := True;
FDQuery1.IndexName := AIndex.Name;
end;
顺便说一下,如果索引中标记了多个列,我不确定您的代码应该做什么,但我会留给您; =)