Delphi ClientDataSet 通过更改 IndexName 进行排序

Delphi ClientDataSet Sorting by changing IndexName

我一直在了解 delphi 中的 ClientDataSet 以及它如何帮助对我的 SQL 数据库进行排序。数据在我的 TDBGrid 中显示正常,我通过更改 ClientDataset 的 IndexField 单击 header 启用了排序。有时我想让它在排序上下降,所以一直在尝试使用这里列出的 2 个 IndexNames

但是,当我将 IndexName 从 DEFAULT_ORDER 换成 CHANGEINDEX 时,我的 DBGrid 中的所有数据都消失了。我对所有这一切都很陌生,我知道这将取决于我的情况,但发生这种情况的方式有哪些,我将尝试解决这些问题。

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

托比

ClientDataSet 带有两个预定义索引:DEFAULT_ORDER 和 CHANGEINDEX,它们对您的任务没有实际用处,因为您无法根据需要调整它们。所以你必须创建自己的索引。可以在 this article as well as in his highly recommended book about ClientDataSets.

中找到 Cary Jensen 的全面描述

我使用以下代码为客户端数据集构建索引:

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;

因此,有一个索引 'idx0' 用于对第 0 列进行升序排序,'idx1' 用于对第 0 列进行降序排序; 'idx2' 和 'idx3' 用于第 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;

在每种形式中,我定义了一个布尔数组 ('directions'),每个网格列一个元素。这些元素跟踪列是否应按升序或降序排序。