Delphi DBGrid 数据排序(ADOQuery、ADOTable、AdoDataSet、Clientdataset、UniQuery、FDQuery)  
官方Delphi 学习QQ群: 682628230(三千人)
频道

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


https://www.cnblogs.com/guorongtao/p/13651678.html


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.28323984146118 seconds