现在我已有数据在TClientDataSet,我怎么样排序呢?

解决方案 »

  1.   

    cds.AddIndex(lIndexName, ColumnFieldName, [ixDescending]);
    cds.IndexName := lIndexName;
      

  2.   

    http://borland.mblogger.cn/aiirii/posts/4846.aspxprocedure TDmMain.SetCdsIndexName(cds: TClientDataSet;
      ColumnFieldName: string);
    var
      lIndexName: string;
    begin
      inherited;
      if not cds.Active then Exit;
      if cds.FieldByName(ColumnFieldName).FieldKind <> fkData then
      begin
        if cds.FieldByName(ColumnFieldName).FieldKind = fkLookup then
          ColumnFieldName := cds.FieldByName(ColumnFieldName).KeyFields
        else
          exit;
      end;
      lIndexName := cds.IndexName;
      if lIndexName <> '' then
        cds.DeleteIndex(lIndexName);
      if AnsiContainsText(lIndexName, ColumnFieldName) then
      begin
        if AnsiContainsText(lIndexName, 'desc') then
        begin
          lIndexName := ColumnFieldName;
          cds.AddIndex(lIndexName, ColumnFieldName, []);
        end
        else
          lIndexName := '';
      end
      else
      begin
        lIndexName := ColumnFieldName + ' desc';
        cds.AddIndex(lIndexName, ColumnFieldName, [ixDescending]);
      end;
      cds.IndexName := lIndexName;
    end;
      

  3.   

    procedure TFrmKeyWordMsgQry.grdKeyWordMsgTitleClick(Column: TColumn);
    begin
      DBGridSort(grdKeywordMsg,Column);
    end;
      

  4.   

    procedure DBGridSort(ADBGrid:TDBGrid;Column:TColumn);
    var
      iFieldCount : integer;
      iLen        : integer;
      StrCaption  : string;
      StrSort     : string;
      TheColumn   : TColumn;
      Str         : string;
    begin
      if (ADBGrid.DataSource.DataSet as TADOQuery).Active then
      begin
        if (ADBGrid.DataSource.DataSet as TADOQuery).RecordCount = 0 then Exit;
        {
        //去掉以前的Order字句
        StrSQL := ADOQuery1.SQL.Text;
        iPos := Pos('order',StrSQL);
        if iPos>0 then StrSQL := Copy(StrSQL,1,iPos-1);
        }
      end
      else
        Exit;  StrSort:='';
      Str :='';  // 遍历表格字段, 初始化Title标题,并取得StrSort
      for iFieldCount := 0 to ADBGrid.Columns.Count - 1 do
      begin
        TheColumn := ADBGrid.Columns[iFieldCount];
        StrCaption := TheColumn.Title.Caption;
        iLen := Length(StrCaption);
        
        //如果当前Column=TheColumn
        if TheColumn=Column then
        begin
          //遇到不可排序字段,则继续
          case TheColumn.Field.DataType of
            ftBoolean,
            ftBytes,
            ftBlob, //Binary
            ftMemo,
            ftGraphic,
            ftFmtMemo, //Formatted memo
            ftParadoxOle:
            begin
              MessageBox('此字段为不可排序字段!',mtWarning,btOK);
              Continue;
            end;
          end;
          Str :=Copy(StrCaption,iLen-1,2);
          //如果为'',则显示' ▲'
          if (Pos('▲',StrCaption)=0) and (Pos('▼',StrCaption)=0) then
          begin
            StrSort := StrSort+TheColumn.FieldName+' ASC,';
            TheColumn.Title.Caption := StrCaption+'▲';
          end
          else begin
            //如果为'▼',则显示''
            if ( Str = '▼') then
            begin
              StrSort := StrSort+'';
              TheColumn.Title.Caption := Copy(StrCaption,1,iLen-2)
            end;
            //如果为'▲',则显示' ▼'
            if ( Str = '▲') then
            begin
              StrSort := StrSort+TheColumn.FieldName+' DESC,';
              TheColumn.Title.Caption:=Copy(StrCaption,1,iLen-2)+'▼';
            end;
          end;
        end
        else begin
          Str :=Copy(StrCaption,iLen-1,2);
          //如果为'',不做响应
          if (Pos('▲',StrCaption)=0) and (Pos('▼',StrCaption)=0) then
          begin
            //
          end
          else begin
            //如果为'▼',降序
            if ( Str = '▼') then  StrSort := StrSort+TheColumn.FieldName+' DESC,';
            //如果为'▲' ,升序
            if ( Str = '▲') then  StrSort := StrSort+TheColumn.FieldName+' ASC,';
          end;
        end;
      end;  //去掉最后一个','
      StrSort := Copy(StrSort,1,Length(StrSort)-1);
      //ShowMessage(StrSort);
      (ADBGrid.DataSource.DataSet as TADOQuery).Sort := StrSort;
    end;
      

  5.   

    以上代码,是我的项目中用的.没有问题.
    你可以将其中的as TADOQuery 换成as TClientDataSet试一试
      

  6.   

    To cocainy:好像Tclientdataset中没有sort属性吧?
    你上面的方法制只能适用于ADO。在dbexpress中,一般的动态排序,就该象一楼说的,AddIndex或者考虑定义添加动态索引在IndexDefs
    和IndexName中.小弟拙见