单击列标题对DBGrid进行排序

时间:2009-07-17 21:46:16

标签: delphi sorting dbgrid

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

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

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

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

此致

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

如前所述,如果您在TClientDataSet的{​​{1}}中使用cds.IndexFieldNames := Column.FieldNameOnTitleClick),则排序非常简单。但是,如果您无法执行此操作,则可以重新生成查询(您已声明不想这样做)或获取更高级的数据网格,例如Express Quantum Grid(我认为您可以对其进行排序) )。

答案 4 :(得分:0)

在TDBGrid的OnTitleClick方法中,您可以编写这个简单的代码:

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

答案 5 :(得分:0)

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

Name:rohit, Age:33, length:152cm

答案 6 :(得分:0)

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

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

将其放入帮助文件中,以便以后可以再次使用。

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