Delphi ClientDataSet通过更改IndexName进行排序

时间:2015-01-21 23:27:37

标签: sql delphi sorting tclientdataset tdbgrid

我一直在学习delphi中的ClientDataSet以及它如何帮助我对SQL数据库进行排序。数据在我的TDBGrid中显示正常,并且我通过更改ClientDataset的IndexField单击标题来启用排序。我想让它在某种程度上逐渐下降,尽管如此一直试图使用这里列出的2个IndexNames https://stackoverflow.com/a/13130816/4075632

但是,当我将IndexName从DEFAULT_ORDER交换到CHANGEINDEX时,我的DBGrid中的所有数据都会消失。我对这一切都很陌生,我知道这将取决于我的情况,但是这会发生什么样的方式,我会尝试解决它们。

我有一个连接到TSQLQuery的TSQLConnection,它连接到TDataSetProvider,并连接到我的ClientDataSet,这导致TDataSource到TDBGrid。为什么ClientDataSet通常很好,当我更改其名称时会导致问题?请记住,大多数设置都是默认设置,因为我对这些组件不太确定。谢谢,我希望你能提供一些有用的帮助,对不起,我的情况可能很难。

托比

2 个答案:

答案 0 :(得分:3)

我使用以下代码为clientdataset构建索引:

Procedure BuildIndices (cds: TClientDataSet);
var
 i, j: integer;
 alist: tstrings;

begin
 with cds do
  begin
   open;
   logchanges:= false;
   for i:= 0 to FieldCount - 1 do
    if fields[i].fieldkind <> fkCalculated then
     begin
      j:= i * 2;
      addindex ('idx' + inttostr (j), fieldlist.strings[i], [], '', '',  0);
      addindex ('idx' + inttostr (j+1), fieldlist.strings[i], [ixDescending], '', '', 0);
     end;
   alist:= tstringlist.create;
   getindexnames (alist);
   alist.free;
   close;
  end;
end;

因此,有一个索引&lt; idx0&#39;用于排序列0升序和&lt; idx1&#39;用于排序列0降序; &#39; IDX2&#39;和&#39; idx3&#39;第1列,等等。

然后,在网格的OnTitleClick事件中,我有以下

procedure Txxx.DBGrid1TitleClick(Column: TColumn);
var
 n, ex: word;

begin
 n:= column.Index;
 try
  dbgrid1.columns[prevcol].title.font.color:= clNavy
 except
 end;

 dbgrid1.columns[n].title.font.color:= clRed;
 prevcol:= n;
 directions[n]:= not directions[n];
 ex:= n * 2;
 if directions[n] then inc (ex);
 with clientdataset do
  try
   disablecontrols;
   indexname:= 'idx' + inttostr (ex);
  finally
   first;
   enablecontrols
  end;
end;

在每种形式中,我定义了一个布尔数组(&#39;方向&#39;),每个网格列一个元素。这些元素跟踪列是应该按升序还是按降序排序。

答案 1 :(得分:1)

ClientDataSet带有两个预定义索引:DEFAULT_ORDER和CHANGEINDEX,它们对您的任务没有用处,因为您无法根据需要调整它们。所以你必须创建自己的索引。 Cary Jensen的综合描述可以在this article以及他强烈推荐的book about ClientDataSets中找到。