如题

解决方案 »

  1.   

    procedure TdfrmSysAuth.DBGrid3DblClick(Sender: TObject);
    var
      strFieldName: String;
    begin
      strFieldName := DBGrid3.Columns[DBGrid3.SelectedIndex].Field.FieldName;
      

  2.   

    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
        column.FieldName;// 就是对应的字段
    begin
      

  3.   

    //==============================================================================
    //点击DBGrid标题栏对查询结果排序************************************************
    //==============================================================================
    function DBGridTitleOrder(Column: TColumn): integer;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //DBGrid.DataSource.DataSet is TTable*****************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      procedure TableOrder;
      begin  end;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //DBGrid.DataSource.DataSet is TQuery*****************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      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
            Result := 1;
            TempStr := ' order by ' + OrderFieldName + ' asc';
            {Column.Title.Caption := Column.Title.Caption + '(▲)';}
            {Column.font.Color := clRed;}
          end else if pos('asc',SQLStr)=0 then
          begin
            Result := 1;
            TempStr := ' order by ' + OrderFieldName + ' asc';
            {Column.Title.Caption := Column.Title.Caption + '(▲)';}
            {Column.font.Color := clRed;}
          end else
          begin
            Result := 2;
            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;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //DBGrid.DataSource.DataSet is TADODataSet************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      procedure ADODataSetOrder;
      begin
        with (TDBGrid(Column.Grid).DataSource.DataSet as TCustomADODataSet) do
        begin
          if  (Pos(Column.Field.FieldName, Sort)=1)
          and (Pos(' DESC', Sort)=0) then
          begin
            Result := 2;
            Sort := Column.Field.FieldName + ' DESC'
          end else
          begin
            Result := 1;
            Sort := Column.Field.FieldName + ' ASC';
          end;
        end;
      end;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //DBGrid.DataSource.DataSet is TClientDataSet*********************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      procedure ClientDataSetOrder;
      begin
        TDBGrid(Column.Grid).Tag := TDBGrid(Column.Grid).Tag xor Round(Exp(Column.Index * Ln(2)));
        with (TDBGrid(Column.Grid).DataSource.DataSet as TClientDataSet) do
        begin
          if Column.Field.DataType<ftAutoInc then
          begin
            if (TDBGrid(Column.Grid).Tag and Round(Exp(Ln(2) * Column.Index)))=0 then
            begin
              AddIndex(Column.FieldName + 'InxDES', Column.FieldName, [ixDescending]);
              IndexName := Column.FieldName + 'InxDES';
              Result := 2;
            end else
            begin
              AddIndex(Column.FieldName + 'InxASC', Column.FieldName, []);
              IndexName := Column.FieldName + 'InxASC';
              Result := 1;
            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 TADODataSet)    then ADODataSetOrder
      else if (TDBGrid(Column.Grid).DataSource.DataSet is TClientDataSet) then ClientDataSetOrder;
    end;
      

  4.   

    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
      if DBGrid1.datasource.dataset.sort=Column.FieldName then
        DBGrid1.datasource.dataset.sort:=Column.FieldName+' DESC'
      else
        DBGrid1.datasource.dataset.sort:=Column.FieldName;
    end;不记得了,好像是sort吧
      

  5.   

    DBGrid1Boolean:  boolean;  //全局变量
     
    ADOTable1:  TADOTable;
      
    procedure  TForm1MainMenu.DBGrid1TitleClick(Column:  TColumn);
    begin
        with  ADOTable1  do    
        begin  
            if  DBGrid1Boolean  then
                TADOTable(ADOTable1).Sort  :=  Column.FieldName  +  '  DESC'
            else
                TADOTable(ADOTable1).Sort  :=  Column.FieldName;
            DBGrid1Boolean  :=  not(DBGrid1Boolean);
        end;
    end;
      

  6.   

    http://www.csdn.net/cnshare/soft/13/13953.shtm
      

  7.   

    写Dbgrid的标题单击事件,然后重新按照这个字段查询(查询的时候排序),
    然后重新刷新,最笨的办法了 ,呵呵!!
      

  8.   

    sort属性在那里,我怎麽没找到
      

  9.   

    to:snjun(@军军@) procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
      if DBGrid1.datasource.dataset.sort=Column.FieldName then
        DBGrid1.datasource.dataset.sort:=Column.FieldName+' DESC'
      else
        DBGrid1.datasource.dataset.sort:=Column.FieldName;
    end;編譯時報錯. undeclared identifier.'sort'