嗯,这似乎有点棘手(如果不是不可能的话)。我正在尝试让我的DBGrid通过单击列的标题对其数据进行排序。
问题是我(遗憾地)使用Delphi 3,我没有使用ADO DataSet,并且查询获取了很多行,因此我无法重新打开我的TQuery更改order by
子句点击。
有人实施了这样的事情吗?
答案 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有TClientDataset
。 TQuery
可以在数据库上使用显式创建的索引来对IndexName
属性上的数据进行排序。
答案 3 :(得分:0)
以下是如何执行此操作的一些示例:Sorting records in Delphi DBGrid by Clicking on Column Title 。
如前所述,如果您在TClientDataSet
的{{1}}中使用cds.IndexFieldNames := Column.FieldName
(OnTitleClick
),则排序非常简单。但是,如果您无法执行此操作,则可以重新生成查询(您已声明不想这样做)或获取更高级的数据网格,例如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)
如果您使用TFDQuery
,TDataSource
和TDBGrid
的组合,则可以通过这种简单的方法订购!
procedure TFrmGer.DBGridTitleClick(Column: TColumn);
begin
OrderByTitle(MyFDQuery, Column);
end;
将其放入帮助文件中,以便以后可以再次使用。
procedure OrderByTitle(AQuery: TFDQuery; Column: TColumn);
begin
AQuery.IndexFieldNames := Column.DisplayName;
end;