请问把数据读到DBGrid后,怎么可以点击某一列,即可以根据此行的顺序对所有的数据进行排列,再次点击的时候可以反响排列。
就像Windows 资源管理器里的按“名称”、“大小”、“时间”等方式排序,点击最上面的三角符可以排序。
分少的话可以再加。  谢谢

解决方案 »

  1.   

    //分是少点
    嘿嘿!~~~~我用的是clientdataset 你修改成你用的dataset
    我用的是bsSkinDBGrid 你修改成dbgrid
    procedure TGLBusinessMgr.aGridTitleSort(Column: TbsColumn);
    var s,cFieldName:string;
        i:integer;
        DataSet:TDataSet;
        procedure setTitle;
        var ii:integer;
            cStr:string;
            c:TbsColumn;
        begin
          for ii:=0 to TbsSkinDBGrid(Column.Grid).Columns.Count-1 do
          begin
            c:=TbsSkinDBGrid(Column.Grid).Columns[ii];
            cStr:=c.Title.Caption;
            if (pos('▲',cStr)=1) or (pos('▼',cStr)=1) then begin
              Delete(cStr,1,2);
              c.Title.Caption:=cStr;
            end;
          end;
        end;
    begin
      setTitle;
      DataSet:=Column.Grid.DataSource.DataSet;
      if Column.Field.FieldKind=fkLookup then
        cFieldName:=Column.Field.KeyFields
      else if Column.Field.FieldKind=fkCalculated then
        cFieldName:=Column.Field.KeyFields
      else
        cFieldName:=Column.FieldName;
      if DataSet is TCustomADODataSet then begin
        s:=TCustomADODataSet(DataSet).Sort;
        if s='' then begin
          s:=cFieldName;
          Column.Title.Caption:='▲'+Column.Field.DisplayName;
        end
        else begin
          if Pos(cFieldName,s)<>0 then begin
            i:=Pos('DESC',s);
            if i<=0 then begin
              s:=s+' DESC';
              Column.Title.Caption:='▼'+Column.Field.DisplayName;
            end
            else begin
              Column.Title.Caption:='▲'+Column.Field.DisplayName;
              Delete(s,i,4);
            end;
          end
          else begin
            s:=cFieldName;
            Column.Title.Caption:='▲'+Column.Field.DisplayName;
          end;
        end;
        TCustomADODataSet(DataSet).Sort:=s;
      end
      else if DataSet is TClientDataSet then begin
    //    TClientDataSet(DataSet).IndexFieldNames:=Column.FieldName;
    /////////////////////////
        if TClientDataSet(DataSet).indexfieldnames<>'' then
        begin
          i:=TClientDataSet(DataSet).IndexDefs.IndexOf('i'+Column.FieldName);
          if i=-1 then
          begin
            with TClientDataSet(DataSet).IndexDefs.AddIndexDef do
            begin
              Name:='i'+Column.FieldName;
              Fields:=Column.FieldName;
              DescFields:=Column.FieldName;
            end;
          end;
          TClientDataSet(DataSet).IndexFieldNames:='';
          TClientDataSet(DataSet).IndexName:='i'+Column.FieldName;
          Column.Title.Caption:='▼'+Column.Title.Caption;//.Field.DisplayName;
        end
        else
        begin
          TClientDataSet(DataSet).IndexName:='';
          TClientDataSet(DataSet).IndexFieldNames:=column.fieldname;
          Column.Title.Caption:='▲'+Column.Title.Caption;//.Field.DisplayName;
        end;
    ////////////////////
      end;end;
      

  2.   

    procedure TDbGridUFrm.DBGrid_DataTitleClick(Column: TColumn);
    var
      i: Integer;
    begin
      i := Column.Index;
      try
        if (Column.Field.DataSet As TADODataSet).Sort <> DBGrid_Data.Columns[i].FieldName + ' ASC' then
          (Column.Field.DataSet As TADODataSet).Sort := DBGrid_Data.Columns[i].FieldName + ' ASC'
        else
          (Column.Field.DataSet As TADODataSet).Sort := DBGrid_Data.Columns[i].FieldName + ' DESC';
      except
        Exit;
      end;    
    end;至于要加▲,你根据代码来写就可以了。
      

  3.   

    建议:
    type
      TDbGridUFrm = class(TFrame)
    再用TDbGridUFrm,你的所有dbgrid都具有排序功能。
    但是有个问题:查询字段的数据无法正常的排序,除非你从dataSet的数据角度来处理。
      

  4.   

    因为某些事耽搁而把这个问题放下几天了。今天试了一下,还是不行。procedure TFrm_Searchdb.DBGrid1TitleClick(Column: TColumn);
    var
     fieldname: string;
     i: integer;
    begin
    i := Column.Index;
      fieldname := DBGrid1.Columns[i].FieldName +'DESC';
      DM_Main.AQuery.Sort := fieldname;
    end;
    当运行到DM_Main.AQuery.Sort := fieldname;这里时弹出“项目在所需的名称或序数中未被发现”。
    是不是因为我查询出来的AQuery的数据是从两个表中select的原因?
      

  5.   

    搞掂了,原来是自己粗心,'DESC'和'ASC'里少了个空格,
    应该为:' DESC'和' ASC'。先定义全局变量:  SortStyle :boolean;
    procedure TFrm_Search.DBGrid1TitleClick(Column: TColumn);
    begin
      if SortStyle = false then
      begin
        DM_Main.AQuery.Sort := Column.FieldName+' ASC';
        SortStyle :=true;
      end
      else
      begin
        DM_Main.AQuery.Sort := Column.FieldName+' DESC';
        SortStyle :=false;
      end;
    end;
      

  6.   

    procedure TfrmvipDA.DBGridEh1TitleClick(Column: TColumnEh);
    var
     fieldname:string;
    begin
      case Column.Index  of
      0:
      begin
        if bSort then//这里可以定义一个Boolean型的变量来控制
        begin
          fieldname := 'kh ASC';
          bSort := False;
        end
        else
        begin
          fieldname :='Kh DESC';
          bSort := True;
        end;
        ADOQitem.Sort :=fieldname;
      end;
      1:
      begin
        if bSort then
        begin
          fieldname := 'fkrq ASC';
          bSort := False;
        end
        else
        begin
          fieldname :='fkrq DESC';
          bSort := True;
        end;
        ADOQitem.Sort :=fieldname;
      end;
      2:
      begin
        if bSort then
        begin
          fieldname := 'zkrq ASC';
          bSort := False;
        end
        else
        begin
          fieldname :='zkrq DESC';
          bSort := True;
        end;
        ADOQitem.Sort :=fieldname;
      end;
      3:
      begin
       if bSort then
       begin
        fieldname:='yje ASC';
        bSort :=False;
       end
       else
       begin
        fieldname :='yje DESC';
        bSort :=True;
       end;
       ADOQitem.Sort :=fieldname;
      end;
      4:
      begin
       if bSort then
       begin
        fieldname:='je ASC';
        bSort :=False;
       end
       else
       begin
        fieldname :='je DESC';
        bSort :=True;
       end;
       ADOQitem.Sort :=fieldname;
      end;
      5:
      begin
       if bSort then
       begin
        fieldname:='yjf ASC';
        bSort :=False;
       end
       else
       begin
        fieldname :='yjf DESC';
        bSort :=True;
       end;
       ADOQitem.Sort :=fieldname;
      end;
      6:
      begin
       if bSort then
       begin
        fieldname:='jf ASC';
        bSort :=False;
       end
       else
       begin
        fieldname :='jf DESC';
        bSort :=True;
       end;
       ADOQitem.Sort :=fieldname;
      end;
      8:
      begin
       if bSort then
       begin
        fieldname:=' ASC';
        bSort :=False;
       end
       else
       begin
        fieldname :=' DESC';
        bSort :=True;
       end;
       ADOQitem.Sort :=fieldname;
      end;
      12:
      begin
       if bSort then
       begin
        fieldname :='yhmc ASC';
        bSort :=false;
       end
       else
       begin
        fieldname:='yhmc DESC';
        bSort :=True;
       end;
       ADOQitem.Sort :=fieldname
      end;
      end;
    end;