各位高手:
    本人在编程时遇到一个排序的问题,客户要求点击网格中的Title实现该字段的排序以及组合排序。我使用的数据库是SQLServer及ADO连接。
    我已经打开了自动排序、多重排序属性开关,也能见到在Title中有一个向上或向下的小箭头,但我现在点击它时对记录一点影响也没有。请问我要如何设置,或写哪些代码才能实现上诉功能。谢谢!!!

解决方案 »

  1.   

    呵呵,看来没人回答你这个问题哦!好了,高手来了。
    对TDBGridEh.OnSortMarkingChanged进行编程,重写SQL语句,象这样:
    procedure TForm1.DBGridEh1SortMarkingChanged(Sender: TObject);
    var
      i: Integer;
      s: string;
      function DeleteStr(str: string; sunstr: string): string; //从Str中删除Sunstr
      var
        i: Integer;
      begin
        i := Pos(sunstr, str);
        if i <> 0 then Delete(str, i, Length(sunstr));
        Result := str;
      end;
    begin
      s := '';
      for i := 0 to DBGridEh1.SortMarkedColumns.Count - 1 do
        if DBGridEh1.SortMarkedColumns[i].Title.SortMarker = smDownEh then
          s := s + DBGridEh1.SortMarkedColumns[i].FieldName + ' DESC , '
        else
          s := s + DBGridEh1.SortMarkedColumns[i].FieldName + ', ';
      if s <> '' then s := ' ORDER BY ' + Copy(s, 1, Length(s) - 2);
      s := DeleteStr(s, '1'); //这里因为显示出来的VName1是Lookup字段,真正
      //Query中的字段为vName,所以这里要去掉'1'
      DataModule1.Query1.SQL.Strings[DataModule1.Query1.SQL.Count - 2] := s;
      //这里的技巧很好,Order by子句在SQL中是倒数第二行,所以这里替换掉重新排序
      DataModule1.Query1.Close;
      DataModule1.Query1.Open;
    end;
    这里所列的过程是Demo1的,我做了注释,在使用一个新的控件之前,仔细研究Demo会比较容易上手。
      

  2.   

    自己在 TITLEONCLICK事件里面用SQL语句写排序最简单了(ORDER BY)
      

  3.   

    to forgot(让一切随风) :
    你说的方法可行,但有个问题我想请教就是如果原数据源是由很多查询条件得来的,那么在重新打开之前是否要重新给变参赋值.
    且你就是直接替换原SQL语句中的倒数第二行好象不妥吧!如果原SQL语句中没有排序那你的SQL语句就会出错!前几天我看到书上说可以用ADOQURTY.SORT进行排可我试了不行!希望各位都去研究一下!
      

  4.   

    唉,为什么不会适当变通一下呢?我给的只是Demo例子。好,儒子可教也!看我出
    招!
    要不要给变参赋值?你不妨换个思路,比如你的SQL语句写的是:Select * from table1 where id=:id,好,你可以在TQuery的OnAfterClose写语句:parambyname('id').value=XXX,OK?
    倒数第二行有什么不妥当吗?你为什么这么死脑筋呢?程序是你写的,你难道不会强制性地把Query中的语句写成倒数第二行为Order by子句吗?如果没有Order by条件的Query,你就直接回车,空一行出来,方便以后赋值,明白没有,呵呵!
    最好不要用ADOQuery,至于原因我也很难说清楚,反正是经验吧!
      

  5.   

    procedure TForm1.DBGridClick(Sender: TObject);
    begin
    adoquery1.close;
    adoquery1.sql.clear;
    adoquery1.sql.add('select * from tabel order by '+DBGridEh1.Columns[i].FieldName);
    adoquery1.open;end;
    如果有多个字段比如 姓名啊 性别 按主从关系写
    adoquery1.sql.add('select * from tabel order by 姓名,性别');