3

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

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

有人实施过这样的事情吗?

4

7 回答 7

7

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

于 2009-07-17T22:19:15.390 回答
3

在 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 语句,即忽略括号注释“{..}”或单行注释“//”

问候

于 2013-04-24T01:36:21.477 回答
0

下面是一些如何做到这一点的示例:通过单击列标题对 Delphi DBGrid 中的记录进行排序

如前所述,如果您使用TClientDataSet( cds.IndexFieldNames := Column.FieldNamein the OnTitleClick) ,排序非常容易TDBGrid。但是,如果您无法做到这一点,您可以重新生成查询(您已声明您不想这样做)或获取更高级的数据网格,例如Express Quantum Grid(我认为它允许您排序)。

于 2009-07-19T22:08:29.210 回答
0

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

于 2009-07-18T04:18:45.597 回答
0

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

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

将它放在一个帮助文件中,以便您以后可以再次使用它。

procedure OrderByTitle(AQuery: TFDQuery; Column: TColumn);
begin
  AQuery.IndexFieldNames := Column.DisplayName;
end;
于 2020-07-15T21:28:14.383 回答
0

示例:(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;
于 2019-09-07T10:35:23.760 回答
0

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

procedure TForm1.DBGrid3TitleClick(Column: TColumn);
var
  cFieldName:string;
begin
  cFieldName:= DBGrid3.SelectedField.FieldName;
  AdoDataset1.Sort:=cFieldName;
end;
于 2017-09-08T04:00:05.633 回答