2009-07-17 61 views
3

好吧,这似乎有点棘手(如果不是可变的)。我试图让我的DBGrid通过点击列标题来对其数据进行排序。通过点击列标题排序DBGrid

事情是,我(可悲)与德尔福3工作,我没有使用ADO数据集,查询得到了很多行,因此我无法重新打开我的TQuery更改点击上的order by子句。

有人已经实现了这样的东西?

回答

4

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

0

德尔福3有TClientDataset。并且TQuery可以在数据库上使用显式创建的索引来订购IndexName属性中的数据。

+0

未必是真实的,既不是我的德尔福4 Pro的也不是我的Delphi 5 Pro安装具有的TClientdataSet。也许它只是在企业版本中? – mghie 2009-07-18 10:56:12

+0

嗯。在这些版本中,我只接触企业版本(因为我通常在本地工作)。但D3企业肯定有TClientDataset。 – 2009-07-18 18:02:03

0

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

如前所述,如果在TDBGridOnTitleClick中使用TClientDataSetcds.IndexFieldNames := Column.FieldName),则排序相当容易。但是,如果你无法做到这一点,你可以重新生成你的查询(你已经声明你不想这么做)或者获得一个更高级的数据网格,比如Express Quantum Grid(我认为你可以对它进行排序)。

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批处理语句,从而可能导致多个“按订单..”条款或评论的SQL语句,即忽略括号内的注释“{..}”或单行注释“//”

问候

+2

这个问题特别说“我不能重新打开我的TQuery,改变点击次序的子句”。如何发布一个答案,确切地说问题**要怎么做**帮助? – 2013-04-24 01:45:30

0

在TDBGrid中的OnTitleClick方法,你可以写简单的代码:

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