我用Query从数据库中查出相关的记录后,显示在DBGrid中,样式如下:ItemCode    Name      Quantity      Amount
000001      工具A        5           1000
000002      工具B        8           8000
000003      工具C        1           9000
000004      工具D        4           1000
000005      工具E        2           4500查出之后,我现在想重新排一下序,就是按DBGrid中各相应的列头按钮,使其按着所点击的列排序(按一下使其升序,再按一下使用降序,就像Windows中,在文件夹里按文件名排序文件一样)例如: 我按了一下DBGrid中Amount列的列头按钮<Amount>,那么这个DBGrid现在里面的记录就按着Amount来排序,按一下Amount,DBGride就按着Amount升序排列,再按一下就按Amount降序排列,按其它的列头按钮也同样。请问高手,如何才能实现???小弟在此谢过~!!

解决方案 »

  1.   

    如果是ADO的话定义全局变量SortStyle:boolean;procedure TQrm_SMX.DBGrid1TitleClick(Column: TColumnEh);
    begin
    if SortStyle=false then
      begin
        dm.adoqury1.Sort:=Column.FieldName+' ASC';
        SortStyle:=true;
      end
      else
      begin
        dm.adoqury1.Sort:=Column.FieldName+' DESC';
        SortStyle:=false;
      end;
    end;
      

  2.   

    ADOQuery1.Sort := 'Amount ASCEND';   // Amount 按升序排列
    ADOQuery1.Sort := 'Amount DESCEND';  // Amount 按降序排列也可以多列排序, 如: 'Name ASCEND, Amount DESCEND'关于记忆升降序的问题就比较简单了, 只要增加一个变量记录排列状态即可, 如: FIsDescend: Boolean; 默认值为 False, 只要按一下就做: FIsDescend := not FIsDescend;若要做得细一点, 则记录 click 列, 当列改变时初始化 FIsDescend := False 即可.
      

  3.   

    错了, 应该使用 ASC 和 DESC 做升降序排列
      

  4.   

    1。如果是ADO就可以直接用它的asc和desc方法排序。
    2.你也可以再重新执行一次SQL语句排序吗。
      

  5.   

    procedure TForm1.DBGrid1TitleClick(column:TColumn);
    begin
      if Boolean then
        ADOQuery1.Sort := Column.FieldName + ASC'
      else
        ADOQuery1.Sort := Column.FieldName + 'DESC';
    end;
      

  6.   

    procedure Tfmmjquery.DBGrid1TitleClick(Column: TColumn);
    var
        sOrder :String; 
    begin
      if blOrder then
      begin
        sOrder := 'DESC';
        blOrder := False;
      end
      else
      begin
        sOrder := '';
        blOrder := True;
      end; aq1.Sort:=Column.FieldName +' '+sOrder;end;
      

  7.   

    需要的话加我qq:35998880,注明:csdn。我在隐身
      

  8.   

    //
    //                       使用说明:单击DBGridEh的标题栏排序(适用于ADO)
    //            --在DBGridEh的事件OnTitleBtnClick引用该函数即可:
    //               SortDBGridEh(Sender, ACol, Column);
    //            --为了保证表格的每一列都能点击触发排序,你需要将你需要排序的列属性
    //            --  Title->TitleButton设置为True。
    //
    procedure SortDBGridEh(Sender: TObject; ACol: Integer; Column: TColumnEh);
    var
      FieldName, SortStr: string;
    begin
      Screen.Cursor := crSQLWait;
      try
        if (Sender is TDBGridEh) and
          ((Sender as TDBGridEh).DataSource.DataSet <> nil) then
        begin
          if not ((Sender as TDBGridEh).DataSource.DataSet is
            TCustomADODataSet) then
            Exit;
          if not (Sender as TDBGridEh).DataSource.DataSet.Active then
            Exit;
          FieldName := Column.FieldName;
          if (Sender as
            TDBGridEh).DataSource.DataSet.FindField(FieldName).IsBlob then
            Exit;
          if (Sender as
            TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
            fkData then
            SortStr := FieldName
          else if (Sender as
            TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
            fkLookup then
            FieldName := (Sender as TDBGridEh).DataSource.DataSet.FieldByName
              (FieldName).KeyFields
          else
            FieldName := '';
          if (FieldName = '') or (Pos(';', FieldName) > 0) then
            Exit;
          case Column.Title.SortMarker of
            smNoneEh:
            begin
              Column.Title.SortMarker := smUpEh;
              TCustomADODataSet((Sender as
                TDBGridEh).DataSource.DataSet).Sort :=
                FieldName;
            end;
            smUpEh:
            begin
              Column.Title.SortMarker := smDownEh;
              TCustomADODataSet((Sender as
                TDBGridEh).DataSource.DataSet).Sort :=
                FieldName + ' DESC';
            end;
            smDownEh:
            begin
              Column.Title.SortMarker := smNoneEh;
              TCustomADODataSet((Sender as
                TDBGridEh).DataSource.DataSet).Sort := '';
            end;
          end;
        end;
      finally
        Screen.Cursor := crDefault;
      end;
    end; 
      

  9.   

    算了,今天我麻。就帮帮兄弟们吧!
    procedure Tfzaomo.DBGrid1TitleClick(Column: TColumn); //排序
    var
        i:integer;
        fieldname:string;begin
        DBGrid1.Columns[0].Title.caption:='aa';
        DBGrid1.Columns[1].Title.caption:='bb';
        DBGrid1.Columns[2].Title.caption:='cc';
        DBGrid1.Columns[3].Title.caption:='dd';
        DBGrid1.Columns[4].Title.caption:='ee';
        DBGrid1.Columns[5].Title.caption:='ff';
     i:=Column.Index;
        if bSort then
        begin
            fieldname:=DBGrid1.Columns[i].FieldName+' ASC';
            dbgrid1.Columns[i].Title.Caption:= dbgrid1.Columns[i].Title.Caption+'▲';
            bSort:=False;
        end
        else
        begin
            fieldname:=DBGrid1.Columns[i].FieldName+' DESC';
            dbgrid1.Columns[i].Title.Caption:= dbgrid1.Columns[i].Title.Caption+'▼';
            bSort:=True;
        end;    adoquery1.Sort:=fieldname;
    end;可以发分了!
      

  10.   

    从来没用过DBGRID,从学DELPHI起,表格都用DBGRIDEH,非常满意。你需要的功能用DBGRIDEH不编程就可以实现。建议试试。盒子里有下好像是3.6的。如果有不明白的,可以联系我[email protected]
      

  11.   

    上面几位仁兄,你们都提到sOrder 和 blOrder 这是什么? 小弟还是有点不明白~   唉~!!我用的Query  和DBgrid