Delphi DBGrid 数据排序(ADOQuery、ADOTable、AdoDataSet、Clientdataset、UniQuery、FDQuery)
1、DBGrid 配合ADOQuery 使用
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
i: integer;
begin
for i := 1 to DBGrid1.Columns.Count do
begin
//恢复所有标题字体为默认
DBGrid1.Columns[i - 1].Title.Font.Color := clWindowText;
DBGrid1.Columns[i - 1].Title.Font.Style := [];
end;
if ADOQuery1.Sort <> (Column.FieldName + ' ASC') then //判断原排序方式
begin
ADOQuery1.Sort := Column.FieldName + ' ASC';
Column.Title.Font.Color := clRed; //改变标题行字体为红色,表示当前的排序方式为升序
Column.Title.Font.Style := [fsBold];
end
else
begin
ADOQuery1.Sort := Column.FieldName + ' DESC';
Column.Title.Font.Color := clBlue; //改变标题行字体为红色,表示当前的排序方式为降序
Column.Title.Font.Style := [fsBold];
end;
end;
2、DBGrid 配合ADOTable 操作类似
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
with ADOTable1 do
begin
if DBGrid1Boolean then
TADOTable(ryADOTable1).Sort := Column.FieldName + ' DESC'
else
TADOTable(ryADOTable1).Sort := Column.FieldName;
DBGrid1Boolean := not (DBGrid1Boolean);
end;
end;
3、其他参考(AdoDataSet、Clientdataset)
//How to Use:
//procedure TForm1.DBGrid1TitleClick(Column: TColumn);
//begin
// GridTitleSort(column);
//end;
procedure GridTitleSort(Column: TColumn);
type
TFieldTypeSet = set of TFieldType;
var
s, cFieldName: string;
i: integer;
DataSet: TDataSet;
GridFieldTypeSet: TFieldTypeSet;
procedure SetTitle;
var
ii: integer;
cStr: string;
c: TColumn;
begin
for ii := 0 to TDBGrid(Column.Grid).Columns.Count - 1 do
begin
c := TDBGrid(Column.Grid).Columns[ii];
cStr := c.Title.Caption;
if (pos('↑', cStr) = 1) or (pos('↓', cStr) = 1) then
begin
Delete(cStr, 1, 2);
c.Title.Caption := cStr;
end;
end;
end;
begin
DataSet := Column.Grid.DataSource.DataSet;
GridFieldTypeSet := [ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftTypedBinary, ftFixedChar, ftWideString, ftLargeint, ftVariant];
if not (Column.Field.DataType in GridFieldTypeSet) then
Exit; //§PÂ_¦r¬qÃþ«¬
SetTitle;
if Column.Field.FieldKind = fkLookup then
cFieldName := Column.Field.KeyFields
else if Column.Field.FieldKind = fkCalculated then
cFieldName := Column.Field.KeyFields
else
cFieldName := Column.FieldName;
//=================================AdoDataSet=====================
if DataSet is TCustomADODataSet then
begin
s := TCustomADODataSet(DataSet).Sort;
if s = '' then
begin
s := cFieldName;
Column.Title.Caption := '↑' + Column.Title.Caption;
end
else
begin
if Pos(cFieldName, s) <> 0 then
begin
i := Pos('DESC', s);
if i <= 0 then
begin
s := s + ' DESC';
Column.Title.Caption := '↓' + Column.Title.Caption;
end
else
begin
Column.Title.Caption := '↑' + Column.Title.Caption;
Delete(s, i, 4);
end;
end
else
begin
s := cFieldName;
Column.Title.Caption := '↑' + Column.Title.Caption;
end;
end;
TCustomADODataSet(DataSet).Sort := s;
end
//============================Clientdataset==========================
else if DataSet is TClientDataSet then
begin
if TClientDataSet(DataSet).indexfieldnames <> '' then
begin
i := TClientDataSet(DataSet).IndexDefs.IndexOf('i' + Column.FieldName);
if i = -1 then
begin
with TClientDataSet(DataSet).IndexDefs.AddIndexDef do
begin
Name := 'i' + Column.FieldName;
Fields := Column.FieldName;
DescFields := Column.FieldName;
end;
end;
TClientDataSet(DataSet).IndexFieldNames := '';
TClientDataSet(DataSet).IndexName := 'i' + Column.FieldName;
Column.Title.Caption := '↓' + Column.Title.Caption;
end
else
begin
TClientDataSet(DataSet).IndexName := '';
TClientDataSet(DataSet).IndexFieldNames := column.fieldname;
Column.Title.Caption := '↑' + Column.Title.Caption;
end;
end;
end;
4、如果使用的是 UniQuery 操作类似:
操作 UniQuery 的 IndexFieldNames属性:
indexfieldnames:='字段 desc',
5、FDQuery
参考操作 4
创建时间:2020.09.11 更新时间:2021.01.22 / 2021.06.16