Delphi DBGrid 数据排序(ADOQuery、ADOTable、AdoDataSet、Clientdataset、UniQuery、FDQuery)

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&Acirc;_&brvbar;r&not;q&Atilde;&thorn;&laquo;&not;

  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

 

posted on 2020-09-11 14:47  滔Roy  阅读(2588)  评论(4编辑  收藏  举报

导航