【问题标题】:Sort DBGrid by clicking column's title通过单击列的标题对 DBGrid 进行排序
【发布时间】:2009-07-17 21:46:15
【问题描述】:

嗯,这似乎有点棘手(如果不是不可能的话)。我正在尝试通过单击列的标题来让我的 DBGrid 对其数据进行排序。

问题是我(很遗憾)正在使用 Delphi 3,我没有使用 ADO DataSets 并且查询有很多行,因此我无法重新打开我的 TQuery 更改点击时的 order by 子句.

有人实现了这样的东西吗?

【问题讨论】:

    标签: delphi sorting dbgrid


    【解决方案1】:

    这实际上是通过对数据集进行排序来完成的,然后网格反映了变化。通过在该列的数据集字段上创建索引可以很容易地完成。当然,这只能在支持索引排序的数据集上进行,比如TClientDataset

    【讨论】:

    • 如上所述,DBGrid 的顺序基于 TDataset 中数据的顺序。因此,更改 DBGrid 顺序的唯一方法是更改​​ TDataset 的顺序,这取决于您正在使用的实际 TDataset 后代......所以您可能会考虑创建自己的 TDataset 后代,它反映了另一个 TDataset 中的数据所需的顺序。
    • TFDQuery 也支持索引。
    【解决方案2】:

    在 TDBGrid 的 OnTitleClick 方法上,您可以执行类似...

    procedure TfmForm1.DBGrid1TitleClick(Column: TColumn);
    var
       i: Integer;
    begin
       // apply grid formatting changes here e.g. title styling
       with DBGrid1 do
          for i := 0 to Columns.Count - 1 do
             Columns[i].Title.Font.Style := Columns[i].Title.Font.Style - [fsBold];
       Column.Title.Font.Style := Column.Title.Font.Style + [fsBold];
    
       with nxQuery1 do // the DBGrid's query component (a [NexusDB] TnxQuery)
       begin
          DisableControls;
          if Active then Close;
          for i := 0 to SQL.Count - 1 do
             if (Pos('order by', LowerCase(SQL[i])) > 0) then
                //NOTE: ' desc' The [space] is important
                if (Pos(' desc',LowerCase(SQL[i])) > 0) then 
                   SQL[i] := newOrderBySQL
                else
                   SQL[i] := newOrderBySQL +' desc';
          // re-add params here if necessary
          if not Active then Open;
          EnableControls;
       end;
    end;
    

    我敢肯定,您可以通过多种方式对其进行优化,但这取决于您使用的组件的功能。上面的示例使用查询组件,但如果您使用表组件,您将更改使用的索引而不是“order by”子句。

    这里对 SQL 的处理是一个非常基础的版本。它不处理 SQL 批处理语句之类的事情,导致可能出现多个“order by..”子句或注释 SQL 语句,即忽略括号内的 cmets "{..}" 或单行 cmets "//"

    问候

    【讨论】:

    • 该问题明确表示“我无法重新打开我的 TQuery,在点击时更改 order by 子句。”。发布一个完全符合问题要求的答案如何不做有什么帮助?
    【解决方案3】:

    Delphi 3 有TClientDataset。并且TQuery 可以使用在数据库上显式创建的索引来对IndexName 属性上的数据进行排序。

    【讨论】:

    • 不一定正确,我的 Delphi 4 Pro 和我的 Delphi 5 Pro 安装都没有 TClientDataSet。也许它只在企业版中?
    • 嗯。在这些版本中,我只接触了企业版(因为我通常在 loco 工作)。但 D3 Enterprise 肯定有 TClientDataset。
    【解决方案4】:

    以下是一些如何执行此操作的示例:Sorting records in Delphi DBGrid by Clicking on Column Title

    如前所述,如果您使用TClientDataSetOnTitleClick 中的cds.IndexFieldNames := Column.FieldName 中的TDBGrid),则排序非常容易。但是,如果您无法执行此操作,您可以重新生成查询(您已声明您不想这样做)或获取更高级的数据网格,例如 Express Quantum Grid(我认为允许您进行排序)。

    【讨论】:

      【解决方案5】:

      在 TDBGrid 的 OnTitleClick 方法上,您可以编写以下简单代码:

      procedure TForm1.DBGrid3TitleClick(Column: TColumn);
      var
        cFieldName:string;
      begin
        cFieldName:= DBGrid3.SelectedField.FieldName;
        AdoDataset1.Sort:=cFieldName;
      end;
      

      【讨论】:

        【解决方案6】:

        示例:(https://www.thoughtco.com/sort-records-in-delphi-dbgrid-4077301)

        procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        var
         pt: TGridcoord;
        begin
         pt:= DBGrid1.MouseCoord(x, y);
         if pt.y=0 then
         DBGrid1.Cursor:=crHandPoint
         else
         DBGrid1.Cursor:=crDefault;
        end;
        
        procedure TForm1.DBGrid1TitleClick(Column: TColumn);
        var
          cFieldName:string;
        begin
          Adotable1.Sort := Column.Field.FieldName;
        end;
        

        【讨论】:

        • 请解释这是如何回答问题的
        【解决方案7】:

        如果您使用TFDQueryTDataSourceTDBGrid 的组合,您可以通过这种简单的方式订购!

        procedure TFrmGer.DBGridTitleClick(Column: TColumn);
        begin
          OrderByTitle(MyFDQuery, Column);
        end;
        

        把它放在一个帮助文件中,这样你以后可以再次使用它。

        procedure OrderByTitle(AQuery: TFDQuery; Column: TColumn);
        begin
          AQuery.IndexFieldNames := Column.DisplayName;
        end;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-10
          • 2016-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多