如果你用的是ADO就可以在单击标题栏事件(TitleClick)中加如下代码
////
TADODataSet(TDBGrid(Sender).DateSource.DataSet).Sort := Column.FieldName;
////
////
TADODataSet(TDBGrid(Sender).DateSource.DataSet).Sort := Column.FieldName;
////
解决方案 »
- *****新人问:求定时方法*****
- database login問題
- 关于rave的memo控件中文无法正常显示怎么解决?
- 問一個很簡單的問題,為什麼網上那麼多進銷存的軟件,但很多工廠還是自己請人進行開發.
- 如何解决字段为空的情况!!!
- 哪儿有可以加背景图的TTrackBar控件下载,背景透明的也可以
- 在delphi中如何搜索网站中的全部连接????
- 为什么只有管理我的问题时字体才正常!!点击论坛的其他连接,字体都歪歪扭扭的!!!奇怪!!!
- 请教
- access数据库的密码忘了怎么办呀 有没有通用密码!!!!急!!!
- 请大家提议:delphi编写大型办公系统比Lotus Notes好吗?
- 请问如何给TImage加上滚动条
{
欲实现点击DBGrid的Title对查询结果排序,想作一个通用程序,不是一事一议,
例如不能在SQL语句中增加Order by ...,因为SQL可能原来已经包含Order by ...,
而且点击另一个Title时又要另外排序,目的是想作到象资源管理器那样随心所欲。
procedure TFHkdata.SortQuery(Column:TColumn);
var
SqlStr,myFieldName,TempStr: string;
OrderPos: integer;
SavedParams: TParams;
begin
if not (Column.Field.FieldKind in [fkData,fkLookup]) then exit;
if Column.Field.FieldKind =fkData then
myFieldName := UpperCase(Column.Field.FieldName)
else
myFieldName := UpperCase(Column.Field.KeyFields);
while Pos(myFieldName,';')<>0 do
myFieldName := copy(myFieldName,1,Pos(myFieldName,';')-1)
+ ',' + copy(myFieldName,Pos(myFieldName,';')+1,100);
with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
begin
SqlStr := UpperCase(Sql.Text);
// if pos(myFieldName,SqlStr)=0 then exit;
if ParamCount>0 then
begin
SavedParams := TParams.Create;
SavedParams.Assign(Params);
end;
OrderPos := pos('ORDER',SqlStr);
if (OrderPos=0) or
(pos(myFieldName,copy(SqlStr,OrderPos,100))=0) then
TempStr := ' Order By ' + myFieldName + ' Asc'
else if pos('ASC',SqlStr)=0 then
TempStr := ' Order By ' + myFieldName + ' Asc'
else
TempStr := ' Order By ' + myFieldName + ' Desc';
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;
Prepare;
Open;
end;
end;怎么不行,上面的是对query进行排序的过程}
以上是找回来的哦,不是我的,希望能帮着你
var
sortstrlist:Tstringlist;
begin
sortstrlist:=Tstringlist.Create;
sortstrlist.Sorted:=true;
if Column.Index=0 then
begin
{在这里将dbgrid1的name放入一个tstringlist组件,设置tstringlist的sorted属性=ture}
{然后在DBGrid1DrawColumnCell中将tstringlist的值写入grid}
end;
sortstrlist.free;
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
//好像也不容易,你先想想
end;
最有效也最麻烦的办法是不用DBGrid,将所有数据放在数组中,这样可用各种排序算法对数据排序。
begin
if not (Column.Field is TBlobField) then
TClientDataset(Column.Field.DataSet).IndexFieldNames:=Column.Field.FieldName;
end;
procedure TMainForm.DBGridTitleClick(Column: TColumn);
var
term:string;
begin
if not (Column.Field is TBlobField) then
term:=Column.Field.FieldName;
query1.close;
query1.sql.clear;
query1.sql.add('select * from XXX order by '+term);
query1.open;
end;
倒序也差不多
其中Column.FieldName就是字段名
稍加控制就可以实现了
而不会站用网络资源