我一直在学习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通常很好,当我更改其名称时会导致问题?请记住,大多数设置都是默认设置,因为我对这些组件不太确定。谢谢,我希望你能提供一些有用的帮助,对不起,我的情况可能很难。
托比
答案 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中找到。