0

我一直在学习 delphi 中的 ClientDataSet 以及它如何帮助对我的 SQL 数据库进行排序。数据在我的 TDBGrid 中显示良好,我通过更改 ClientDataset 的 IndexField 来单击标题启用排序。我有时想让它按排序下降,所以一直在尝试使用此处概述的 2 个索引名称https://stackoverflow.com/a/13130816/4075632

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

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

托比

4

2 回答 2

3

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

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列进行降序排序;第 1 列的“idx2”和“idx3”等。

然后,在网格的 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;

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

于 2015-01-22T10:00:54.433 回答
0

ClientDataSet 带有两个预定义索引:DEFAULT_ORDER 和 CHANGEINDEX,它们对您的任务没有实际用途,因为您无法根据需要调整它们。所以你必须创建自己的索引。Cary Jensen 的全面描述可以在这篇文章以及他强烈推荐的关于 ClientDataSets 的书中找到。

于 2015-01-22T07:48:16.560 回答