【问题标题】:Delphi ClientDataSet Sorting by changing IndexNameDelphi ClientDataSet 通过更改 IndexName 进行排序
【发布时间】:2015-03-20 15:44:58
【问题描述】:

我一直在学习 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 可能会导致问题?请记住,大多数设置都是默认设置,因为我不太确定这些组件。谢谢,希望您能提供一些有用的帮助,很抱歉我的情况可能难以了解。

托比

【问题讨论】:

    标签: sql delphi sorting tclientdataset tdbgrid


    【解决方案1】:

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

    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;
    

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

    【讨论】:

    • 谢谢!快到了,但什么是prevcoI?我收到未声明的变量错误。谢谢
    • @TobyFox:prevcol 是一个属于表单的整数变量(忘记了)。它存储上一个选定列的值。
    • 您好,谢谢。我确信这会起作用,因为它看起来是正确的,但是我的数据库表仍然没有显示,并且每次单击标题时都会出现错误“无法对关闭的数据集执行操作”。所以我想我原来的问题仍然存在。当 CDS 的名称不是默认名称时,DBGrid 中不会显示数据。我认为我应该检查什么?非常感谢,托比
    • 好的,我现在知道它在这一行之后中断了:with CustomerCDS do try disablecontrols; IndexName:= 'idx' + inttostr (AscDescSetBegin); showmessage('First Part'); finally first; 导致该消息的“第一”是什么?谢谢
    • @TobyFox:根据您的 cmets 判断,数据集已关闭 - 您应该在“buildindices”程序之后打开它以显示数据,或者可能从“buildindices”中删除“关闭”行. 'First' 使数据集以新的排序顺序从第一条记录开始显示。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多