如果你用的是ADO就可以在单击标题栏事件(TitleClick)中加如下代码
////
  TADODataSet(TDBGrid(Sender).DateSource.DataSet).Sort := Column.FieldName;
////

解决方案 »

  1.   

    这里有一个相关的过程,转来的,哈哈
    {
    欲实现点击DBGrid的Title对查询结果排序,想作一个通用程序,不是一事一议,
    例如不能在SQL语句中增加Order by ...,因为SQL可能原来已经包含Order by ...,
    而且点击另一个Title时又要另外排序,目的是想作到象资源管理器那样随心所欲。
    procedure TFHkdata.SortQuery(Column:TColumn);
    var
      SqlStr,myFieldName,TempStr: string;
      OrderPos: integer;
      SavedParams: TParams;
    begin
      if not (Column.Field.FieldKind in [fkData,fkLookup]) then exit;
      if Column.Field.FieldKind =fkData then
        myFieldName := UpperCase(Column.Field.FieldName)
      else
        myFieldName := UpperCase(Column.Field.KeyFields);
      while Pos(myFieldName,';')<>0 do
        myFieldName := copy(myFieldName,1,Pos(myFieldName,';')-1)
                      + ',' + copy(myFieldName,Pos(myFieldName,';')+1,100);
      with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
      begin
        SqlStr := UpperCase(Sql.Text);
    //  if pos(myFieldName,SqlStr)=0 then exit;
        if ParamCount>0 then
        begin
          SavedParams := TParams.Create;
          SavedParams.Assign(Params);
        end;
        OrderPos := pos('ORDER',SqlStr);
        if (OrderPos=0) or
          (pos(myFieldName,copy(SqlStr,OrderPos,100))=0) then
          TempStr := ' Order By ' + myFieldName + ' Asc'
        else if pos('ASC',SqlStr)=0 then
          TempStr := ' Order By ' + myFieldName + ' Asc'
        else
          TempStr := ' Order By ' + myFieldName + ' Desc';
        if OrderPos<>0 then SqlStr := Copy(SqlStr,1,OrderPos-1);
        SqlStr := SqlStr + TempStr;
        Active := False;
        Sql.Clear;
        Sql.Text := SqlStr;
        if ParamCount>0 then
        begin
          Params.AssignValues(SavedParams);
          SavedParams.Free;
        end;
        Prepare;
        Open;
      end;
    end;怎么不行,上面的是对query进行排序的过程}
    以上是找回来的哦,不是我的,希望能帮着你
      

  2.   

    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    var
      sortstrlist:Tstringlist;
    begin
      sortstrlist:=Tstringlist.Create;
      sortstrlist.Sorted:=true;  
      if Column.Index=0 then
      begin
      {在这里将dbgrid1的name放入一个tstringlist组件,设置tstringlist的sorted属性=ture}
      {然后在DBGrid1DrawColumnCell中将tstringlist的值写入grid}
      end;
      sortstrlist.free;
    end;
    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
    //好像也不容易,你先想想
    end;
      

  3.   

    ghz2000的想法比较新鲜,但可惜没做出来,zswang(zs)和say()的方法我原来都知道,还是对DbGrid中的字段进行重新排序,那样的话在大批量数据中会有明显的延迟,不知道动态设置索引字段的速度如何,但我没试出来.
      

  4.   

    设索引字段可以进行派序,速度比使用order by来重置数据集要快一点点。但也不是最好的办法。
    最有效也最麻烦的办法是不用DBGrid,将所有数据放在数组中,这样可用各种排序算法对数据排序。
      

  5.   

    利用Tclientdataset可以满足这种要求。procedure TMainForm.DBGridTitleClick(Column: TColumn);
    begin
      if not (Column.Field is TBlobField) then
       TClientDataset(Column.Field.DataSet).IndexFieldNames:=Column.Field.FieldName;
    end;
      

  6.   

    这个方法行吗?那倒序呢?我在InfoPower2000中也接触过这种例子。关注。
      

  7.   

    用SQL语句 order by 排序可实现倒序和顺序
    procedure TMainForm.DBGridTitleClick(Column: TColumn);
    var
    term:string;
    begin
      if not (Column.Field is TBlobField) then
      term:=Column.Field.FieldName;
      query1.close;
      query1.sql.clear;
      query1.sql.add('select * from XXX order by '+term);
      query1.open;
    end;
    倒序也差不多
      

  8.   

    还是对数据库进行排序,我的目的是把DbGrid看作StringGrid一样,只进行显示数据的排序,最好不要涉及数据库的操作,因为那样在数据量巨大时会很慢。
      

  9.   

    可以编写DBGrid1TitleClick(Column: TColumn)进行控制
    其中Column.FieldName就是字段名
    稍加控制就可以实现了
      

  10.   

    对后台库进行SQL操作不太好,用ClientDataSet 要好些,可以动态地建立字段的索引
    而不会站用网络资源