好吧,这似乎有点棘手(如果不是可变的)。我试图让我的DBGrid通过点击列标题来对其数据进行排序。通过点击列标题排序DBGrid
事情是,我(可悲)与德尔福3工作,我没有使用ADO数据集,查询得到了很多行,因此我无法重新打开我的TQuery更改点击上的order by
子句。
有人已经实现了这样的东西?
好吧,这似乎有点棘手(如果不是可变的)。我试图让我的DBGrid通过点击列标题来对其数据进行排序。通过点击列标题排序DBGrid
事情是,我(可悲)与德尔福3工作,我没有使用ADO数据集,查询得到了很多行,因此我无法重新打开我的TQuery更改点击上的order by
子句。
有人已经实现了这样的东西?
这实际上是通过排序数据集来完成的,然后网格反映了这种变化。它可以通过在该列的数据集字段上创建索引来轻松完成。当然,这只能在支持索引排序的数据集上完成,例如TClientDataset
。
德尔福3有TClientDataset
。并且TQuery
可以在数据库上使用显式创建的索引来订购IndexName
属性中的数据。
以下是一些如何操作的示例:Sorting records in Delphi DBGrid by Clicking on Column Title。
如前所述,如果在TDBGrid
的OnTitleClick
中使用TClientDataSet
(cds.IndexFieldNames := Column.FieldName
),则排序相当容易。但是,如果你无法做到这一点,你可以重新生成你的查询(你已经声明你不想这么做)或者获得一个更高级的数据网格,比如Express Quantum Grid(我认为你可以对它进行排序)。
在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批处理语句,从而可能导致多个“按订单..”条款或评论的SQL语句,即忽略括号内的注释“{..}”或单行注释“//”
问候
这个问题特别说“我不能重新打开我的TQuery,改变点击次序的子句”。如何发布一个答案,确切地说问题**要怎么做**帮助? – 2013-04-24 01:45:30
在TDBGrid中的OnTitleClick方法,你可以写简单的代码:
procedure TForm1.DBGrid3TitleClick(Column: TColumn);
var
cFieldName:string;
begin
cFieldName:= DBGrid3.SelectedField.FieldName;
AdoDataset1.Sort:=cFieldName;
end;
未必是真实的,既不是我的德尔福4 Pro的也不是我的Delphi 5 Pro安装具有的TClientdataSet。也许它只是在企业版本中? – mghie 2009-07-18 10:56:12
嗯。在这些版本中,我只接触企业版本(因为我通常在本地工作)。但D3企业肯定有TClientDataset。 – 2009-07-18 18:02:03