怎么可以直接点机dbgrid的列就可以排序

解决方案 »

  1.   

    先定义一个数组 FieldTitleState: array[0..50] of boolean;要足够大
    在formcreate时,初始化
      For i:=0 to 50 do FieldTitleState[i]:=False;在dbgrid 的titleclick事件中:
    procedure TFrmStateCheck.DBGrid1TitleClick(Column: TColumn);
    var
    i,J:integer;
    OldSql:string;
    begin
      i:=column.Index;
      if Lowercase(column.FieldName)='yzname' then exit;
       J:=POS('order by',lowercase(dm.Query1.SQL.Text));
      if FieldTitleState[i]=false then
      begin
        if dm.Query1.SQL.Text='' then
          oldsql:='select * from jfy order by '+Column.FieldName
        else    begin
            if j=0 then oldsql:=dm.Query1.SQL.Text+' order by '+Column.FieldName
            else oldsql:=copy(dm.Query1.SQL.Text,1,j-1)+' order by '+Column.FieldName;
        end;
        OrderData(oldsql);
        FieldTitleState[i]:=true
      end else
      begin
        if dm.Query1.SQL.Text='' then
           oldsql:='select * from jfy order by '+Column.FieldName+' decs'
        else     begin
            if j=0 then oldsql:=dm.Query1.SQL.Text+' order by '+Column.FieldName+' desc'
            else oldsql:=copy(dm.Query1.SQL.Text,1,j-1)+' order by '+Column.FieldName+' desc';
        end;
         OrderData(oldsql);
        FieldTitleState[i]:=False;
      end;
    end;
    procedure TFrmStateCheck.OrderData(StrItem:string);
    begin
      dm.query1.Close; dm.query1.SQL.Clear;
      dm.query1.SQL.Add(StrItem);
      dm.query1.Prepare;
      dm.query1.Open;
    end;
      

  2.   

    直接设置DBGride的Sort属性就可以了
      

  3.   

    利用ehlib中的DBGRIDEH,在每列TILTE屬性下的SORTMARKER設置中設置更簡單,支持所有字段自動排序,升序,降序!!
    如果沒有ehlib的,可發郵件給我:[email protected],我可發給你!,ehlib 3.0版的
      

  4.   

    在titleonclick 时间里添加
    procedure TFormfind.DBGrid1TitleClick(Column: TColumn);
    begin
    if pos('ASC',Adoqfind.Sort)<>0 then
      Adoqfind.Sort:=column.FieldName + ' DESC'
      else
      Adoqfind.Sort:=column.FieldName + ' ASC'
    end;
      

  5.   

    to: wuzongjie(吴飞) 这位兄弟,先谢谢你了!
    问题现在我们这个项目客户要求不能用第三方控件!!
    以后,要是我需要我会跟你联系的!
      

  6.   

    titleonclick 事件中取得这个字段的名称后fieldname
    利用sql语句重新查询
      

  7.   

    sql语句重新查写会出现界面闪动的现象,效果不好。
      

  8.   

    "利用ehlib中的DBGRIDEH,在每列TILTE屬性下的SORTMARKER設置中設置更簡單,支持所有字段自動排序,升序,降序!!
    如果沒有ehlib的,可發郵件給我:[email protected],我可發給你!,ehlib 3.0版的"就用这个,第三方控件有罪吗?
      

  9.   

    http://www.csdn.net/develop/read_article.asp?id=16931
    请参看一下,肯定可以解决的
      

  10.   

    你看一下Delphi的Demo\ADO\ADOTEST。
      

  11.   

    看看能不能帮你...
    procedure TFmXsgl.DBGrid2TitleClick(Column: TColumn);begin
    try
     adoquery1.Close;
     adoquery1.SQL.Clear;
     adoquery1.SQL.Add('select * from txsb order by '+column.FieldName);
     showmessage('select * from txsb order by '+column.FieldName);
     adoquery1.Open;
     datasource2.DataSet :=adoquery1;
     finally
     //adoquery1.Close;
     end;
    end;
      

  12.   

    在窗体中定义
      Flag_PaiXu:Boolean;//升降序
      Field_Sort:String;//排序字段
    再在DBGrid的TitleClick事件中写入下列代码
      Flag_PaiXu:=Not Flag_PaiXu; 
      Field_Sort:=Column.FieldName ;
      With ADOQuery1 do
      begin
        Close;
        Sql.Clear;
        Sql.Add('select * from 表名 order by '+Field_Sort);
        if Flag_PaiXu then
        begin
          Sql.Add(' Desc');
        end
        else
          Sql.Add(' Asc');
        end;
          Open;
      end;
    这样就行了
      

  13.   

    如上所说,使用dbgrideh更好,不用写程序,dbgrideh还有其他方面的好处,如boolean值可以显示checkbox等等
      

  14.   

    http://www.delphibbs.com/keylife/iblog_show.asp?xid=4091 
      

  15.   

    强烈建议使用ehgrid或者DEV EXPRESS之类的三方组件.
    都带源码,比DBGRID要强多了