声明
procedure OnDBGridTitleClick(Column: TColumn);
实现
procedure Tdbs.OnDBGridTitleClick(Column: TColumn);
begin
  try
   if column.Grid.DataSource.DataSet.Active=true then begin
      if column.Grid.Tag=0 then begin
         if column.Grid.DataSource.DataSet.ClassType=TADOQuery then begin
            (column.Grid.DataSource.DataSet as TADOQuery).Sort:=Column.FieldName+' ASC';
            column.Grid.Tag:=1;
         end;
         if column.Grid.DataSource.DataSet.ClassType=TADODataset then begin
            (column.Grid.DataSource.DataSet as TADODataset).Sort:=Column.FieldName+' ASC';
            column.Grid.Tag:=1;
         end;
      end
      else begin
         if column.Grid.DataSource.DataSet.ClassType=TADOQuery then begin
            (column.Grid.DataSource.DataSet as TADOQuery).Sort:=Column.FieldName+' DESC';
            column.Grid.Tag:=0;
         end;
         if column.Grid.DataSource.DataSet.ClassType=TADODataset then begin
            (column.Grid.DataSource.DataSet as TADODataset).Sort:=Column.FieldName+' DESC';
            column.Grid.Tag:=0;
         end;
      end;
   end;
  except
  end;
end;我自己写的,使用时将表格的标题单击事件指向这个过程就可以了,你看看吧

解决方案 »

  1.   

    使用Dxdbgrid,可以实现过滤、排序等好多功能
      

  2.   

    在ONTITLECLICK的事件中写
    利用COLUMN.field.fieldname来设置TABLE的索引字段,或者QUERY的ORDER BY 。。
      

  3.   

    举例如下:
    with AdoQuery1 do
    begin
      close;
      Sql.clear;
      Sql.Add('Select * from table');
      Prepared;
      Sql.Open;
    end;
    设置排序字段:
    self.ADOResult1.Sort:='编码 ASC';
    在DBGrid1CellClick里面编写程序,根据不同的列
    再次给self.ADOResult1.Sort赋不同的值
      

  4.   

    TO:rwdx(任我独行)
    谢谢,不过我的DataSet不是ADO,不支持排序
      

  5.   

    TO:fyje(冬原) 
    什么地方可以下载Dxdbgrid,
    要不给我发一个 :[email protected]
    先谢了
      

  6.   

    声明一个 全局的AIndexName;
    var
      desc: Boolean;
    begin
      with TTable(Column.Grid.DataSource.DataSet) do
      begin
        desc:=false;
        if (AIndexName=Column.Fieldname) and (AIndexName<>'') then
          desc:=true;
        if AIndexName<>'' then
          DeleteIndex(AIndexName);
        if desc then
          AIndexName:=Column.FieldName+'desc'
        else
          AIndexName:=Column.FieldName;
        if desc then
          AddIndex(AIndexName,Column.FieldName,[ixCaseInsensitive,ixDescending])
        else
          AddIndex(AIndexName,Column.FieldName,[ixCaseInsensitive]);
        IndexName:=AIndexName;
      end
    end
      

  7.   

    TO:qiubolecn(来自差生市) 
    AddIndex是不是要动态给Table生成索引的
      

  8.   

    //==============================================================================
    //点击DBGrid标题栏对查询结果排序************************************************
    //==============================================================================
    procedure DBGridTitleOrder(Column: TColumn);
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      procedure TableOrder;
      begin  end;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      procedure QueryOrder;
      var
        SQLStr, OrderFieldName, TempStr: string;
        i, OrderPos: integer;
        SavedParams: TParams;
      begin
        if not (TQuery(TDBGrid(Column.Grid).DataSource.DataSet).State in [dsBrowse]) then Exit;
        SavedParams := nil;
        for i:=0 to Column.Grid.FieldCount-1 do
        begin
          {TDBGrid(Column.Grid).Columns[i].Font.Color := clBlack;}
          TDBGrid(Column.Grid).Columns[i].Title.Caption := TDBGrid(Column.Grid).Columns[i].Field.DisplayName;
        end;
        if not (Column.Field.FieldKind in [fkData,fkLookup]) then Exit;
        if Column.Field.FieldKind=fkData
        then OrderFieldName := LowerCase(Column.Field.FieldName)
        else OrderFieldName := LowerCase(Column.Field.KeyFields);
        while Pos(OrderFieldName,';')<>0 do OrderFieldName := copy(OrderFieldName,1,Pos(OrderFieldName,';')-1)+','+copy(OrderFieldName,Pos(OrderFieldName,';')+1,100);
        with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
        begin
          SQLStr := LowerCase(SQL.Text);
          if ParamCount>0 then
          begin
            SavedParams := TParams.Create;
            SavedParams.Assign(Params);
          end;
          OrderPos := pos('order',SQLStr);
          if (OrderPos=0) or (pos(OrderFieldName,copy(SQLStr,OrderPos,100))=0) then
          begin
            TempStr := ' order by ' + OrderFieldName + ' asc';
            {Column.Title.Caption := Column.Title.Caption + '(▲)';}
            {Column.font.Color := clRed;}
          end else if pos('asc',SQLStr)=0 then
          begin
            TempStr := ' order by ' + OrderFieldName + ' asc';
            {Column.Title.Caption := Column.Title.Caption + '(▲)';}
            {Column.font.Color := clRed;}
          end else
          begin
            TempStr := ' order by ' + OrderFieldName + ' desc';
            {Column.Title.Caption := Column.Title.Caption + '(▼)';}
            {Column.font.Color := clGreen;}
          end;
          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;
          Open;
        end;
      end;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      procedure ClientDataSetOrder;
      //var Descend: Byte;
      begin
        {
        with (TDBGrid(Column.Grid).DataSource.DataSet as TClientDataSet) do
        begin
          Descend := Descend xor Round(Exp(Column.Index * Ln(2)));
          if Column.Field.DataType<ftAutoInc then
          begin
            if (Descend and Round(Exp(Ln(2) * Column.Index)))=0 then
            begin
              AddIndex(Column.FieldName + 'InxDES' , Column.FieldName, [ixDescending],'','',0);
              IndexName := Column.FieldName + 'InxDES';
            end else
            begin
              AddIndex(Column.FieldName + 'Inx' ,Column.FieldName ,[],'','',0);
              IndexName := Column.FieldName + 'Inx';
            end;
          end;
        end;
        }
      end;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    begin
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           if (TDBGrid(Column.Grid).DataSource.DataSet is TTable)         then TableOrder
      else if (TDBGrid(Column.Grid).DataSource.DataSet is TQuery)         then QueryOrder
      else if (TDBGrid(Column.Grid).DataSource.DataSet is TClientDataSet) then ClientDataSetOrder;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    end;
      

  9.   

    to tongdf()是的因为考虑到表本身不会有索引,所以我在这里手动建了。你也可以不删除以前的索引;
      

  10.   

    用dx吧!!她的dbgrid集排序、分组、合计等常用功能于一身!!
      

  11.   

    你们现在是对单个字段进行排序的,对于CLIENTDATASET,如果我想同时让一个字段升序,一个字段降序。而且不能用SQL语句,相信各位就没有方法了哦
      

  12.   

    这个程序我也写过,不复杂,只是加order by...而已,但是总觉得不好。
    dx在哪儿也告诉我吧。