• 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

    博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你所有帮助,谢谢!
  • 相关阅读:
    IntelliJ IDEA 2019.3 安装+永久破解[Windows]
    word2016中如何实现类似目录样式的虚线对齐效果,可用于制作checklist
    测绘地图资源不够用?教你个万能图源制作方法
    真实评测:全球卫星地图哪个最清晰?
    【地图导航】3D地图软件是如何做路径规划的?为什么准确率这么高
    国产良心极简版地图软件,地图下载很丝滑,界面简洁无广告
    推荐几款实用性强的外业勘察地图软件
    重要通知!奥维地图被紧急下架,还有什么地图软件能用呢?
    单片机平台环境
    关于最近登陆需要验证手机
  • 原文地址:https://www.cnblogs.com/guorongtao/p/13651678.html
Copyright © 2020-2023  润新知