我的dbgrid的数据源为一ttable控件,想要在记录出来后进行按2个列排序,
不知如何写代码?

解决方案 »

  1.   

    我以前做过一个,是一个价格的表格,其中某些功能可能和你的相似吧。
    就是点击价表时。可以按价格的大小进行排序。不是可否。
    如果行的话考过去参考吧。
    dbgrid中标题点击的事件。
    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text:= 'select * from MainTable order by+"'+ Column.FieldName +'"';
      ADOQuery1.Open;
    end;
      

  2.   

    排序就要进行查找,如按名称,按字符等。你可以在排序过程中建立一个query的不影响你的数据。只是进行排序时用到了。
      

  3.   

    呵呵,即使换成tquery也不麻烦啊
      

  4.   

    参考一下我的代码:
    procedure Tmoduleform.DBGrid1TitleClick(Column: TColumn);
    begin
      if clientdataset1.IsEmpty then
         exit;
      clientdataset1.DisableControls;
      if indexname='降序' then  //按升序排列
         begin
           if clientdataset1.IndexName='Indexname' then
              clientdataset1.DeleteIndex('Indexname');
           clientdataset1.AddIndex('Indexname',column.FieldName,[],column.FieldName,'',0);
           ClientDataSet1.IndexName:='Indexname';
           indexname:='升序';
         end
      else   //按降序排列
         begin
           if clientdataset1.IndexName='Indexname' then
              clientdataset1.DeleteIndex('Indexname');
           clientdataset1.AddIndex('Indexname',column.FieldName,[],'','',0);
           ClientDataSet1.IndexName:='Indexname';
           indexname:='降序';
         end;
      clientdataset1.EnableControls;
      isenabled;
      showstate;
    end;
      

  5.   

    **********抢分行动***********
    碰到问题查不到,花了半天时间作了一个,不敢独享。
    ADO类的数据集有Sort,但是TClientDataSet没有,故作。procedure SortCDS(Column:TColumn);
    function FindColumn(Grid:TDbGrid;Name:string):TColumn;
    var
      i:integer;
    begin
      Result:=nil;
      for i:=0 to Grid.Columns.Count-1 do
        if Grid.Columns.Items[i].FieldName=Name then
          Result:=Grid.Columns.Items[i];
    end;
    var
      DataSet:TClientDataSet;
      ASC:boolean;      
      Clm:TColumn;
    begin
      DataSet:=TClientDataSet(Column.Field.DataSet);
      if Assigned(DataSet) and (not DataSet.IsEmpty) then
      begin
        if DataSet.IndexName=Column.Fieldname then
          ASC:=StrPos(PChar(Column.Title.Caption),'▼')<>nil;
        Clm:=FindColumn(TDbGrid(Column.Grid),DataSet.IndexName);
        if Assigned(Clm) then
        begin
          DataSet.DeleteIndex(DataSet.IndexName);
          Clm.Title.Caption:=Copy(Clm.Title.Caption,1,Length(Clm.Title.Caption)-2);
        end;
        if Asc then
        begin
          DataSet.AddIndex(Column.Fieldname,Column.FieldName,
                          [ixCaseInsensitive,ixDescending]);
          Column.Title.Caption:=Column.Title.Caption+'▲';
        end
        else begin
          DataSet.AddIndex(Column.Fieldname,Column.FieldName,[ixCaseInsensitive]);
          Column.Title.Caption:=Column.Title.Caption+'▼';
        end;
        DataSet.IndexName:=Column.Fieldname;
      end;
    end;