各位高手:
本人在编程时遇到一个排序的问题,客户要求点击网格中的Title实现该字段的排序以及组合排序。我使用的数据库是SQLServer及ADO连接。
我已经打开了自动排序、多重排序属性开关,也能见到在Title中有一个向上或向下的小箭头,但我现在点击它时对记录一点影响也没有。请问我要如何设置,或写哪些代码才能实现上诉功能。谢谢!!!
本人在编程时遇到一个排序的问题,客户要求点击网格中的Title实现该字段的排序以及组合排序。我使用的数据库是SQLServer及ADO连接。
我已经打开了自动排序、多重排序属性开关,也能见到在Title中有一个向上或向下的小箭头,但我现在点击它时对记录一点影响也没有。请问我要如何设置,或写哪些代码才能实现上诉功能。谢谢!!!
解决方案 »
- 我只想让form2贴在form1右边,哪错了?
- 急!!!有谁知道的帮帮我。一个控件不能用。
- 如何实现这个功能
- 提示"....EDBEngineError Invalid Length",不知如何改之!
- 请sy_315(夏雨)来接分 。
- 请高手帮助!!求一信号处理问题的最佳实现方法。
- Trxmainmenu控件问题!
- 左右开弓怎么响应???
- 控件安装问题:[Fatal Error] TB97_d6.dpk(31): Required package 'vcl' not found
- XE5的单步调试功能好像比delphi2007差好多啊
- 谁知道在dbgrideh中直接点击title就可按点击的那个字段排序的方法?不盛感激!
- 我的DELPHI7安装后没有REPORT栏,是不是我买的这个版本有问题?
对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会比较容易上手。
你说的方法可行,但有个问题我想请教就是如果原数据源是由很多查询条件得来的,那么在重新打开之前是否要重新给变参赋值.
且你就是直接替换原SQL语句中的倒数第二行好象不妥吧!如果原SQL语句中没有排序那你的SQL语句就会出错!前几天我看到书上说可以用ADOQURTY.SORT进行排可我试了不行!希望各位都去研究一下!
招!
要不要给变参赋值?你不妨换个思路,比如你的SQL语句写的是:Select * from table1 where id=:id,好,你可以在TQuery的OnAfterClose写语句:parambyname('id').value=XXX,OK?
倒数第二行有什么不妥当吗?你为什么这么死脑筋呢?程序是你写的,你难道不会强制性地把Query中的语句写成倒数第二行为Order by子句吗?如果没有Order by条件的Query,你就直接回车,空一行出来,方便以后赋值,明白没有,呵呵!
最好不要用ADOQuery,至于原因我也很难说清楚,反正是经验吧!
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 姓名,性别');