最近写的 仅供参考 : procedure Tform1.SortQuery(column:TColumn); var SqlStr,myFieldName,TempStr: string; OrderPos: integer; SavedParams: TParams; begin if not(Column.Field.FieldKind in [fklookup,fkdata]) 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 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;
procedure TForm1.DBGrid1TitleClick(Column: TColumn); begin with ADOQuery1 do begin Close; SQL.Clear; SQL.Add('select * from yourtable obder by :sortfieldname'); Parameters.ParamByName('sortfieldname').Value := Column.FieldName; Open; end; end;
procedure TForm1.DBGrid1TitleClick(Column: TColumn); begin with Query4 do begin Close; SQL.Clear; SQL.Add('select * from yourtable obder by :sortfieldname'); Parameters.ParamByName('sortfieldname').Value := Column.FieldName; Open; end; end;这样就行!
procedure TForm1.DBGrid1TitleClick(Column: TColumn); begin with query1 do begin close; sql.Clear; sql.Add('select * from 表名 order by :orderlaber'); parambyname('orderlaber').value:=‘列名’; open; end; end;
procedure TForm1.DBGrid1CellClick(Column: TColumn); begin adoquery1.filtered :=true ; adoquery1.Sort:=dbgrid1.selectedfield.FieldName; end;这样只能进行单击一次进行升序,要是想再单击一次进行降序,再单击一次又是升序。以此类推,该怎么解决呢?
procedure TFormMain.DBGrid1TitleClick(Column: TColumn); begin with Table1 do begin IndexFieldNames:=Column.FieldName; end; end;即可实现任何列的排序
www.51delphi.com 上面有个 DevExpress QuantumGrid 4.5
begin
//在这写代码进行排序
end;
begin
adoquery1.filtered :=true ;
adoquery1.Sort:=dbgrid1.selectedfield.FieldName;
end;
begin
//在这写代码进行排序
end;就是重新把sql语句写一次吗?但是column那么多不可能一个个写吧?具体应该怎么写?
Begin
ADOQuery1.Sort := Column.FieldName;
ADOquery1.Filtered := True;
End;
procedure Tform1.SortQuery(column:TColumn);
var
SqlStr,myFieldName,TempStr: string;
OrderPos: integer;
SavedParams: TParams;
begin
if not(Column.Field.FieldKind in [fklookup,fkdata]) 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 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;
begin
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from yourtable obder by :sortfieldname');
Parameters.ParamByName('sortfieldname').Value := Column.FieldName;
Open;
end;
end;
Begin
ADOQuery1.Sort := Column.FieldName;
ADOquery1.Filtered := True;
End;只适用于ADO
begin
with Query4 do
begin
Close;
SQL.Clear;
SQL.Add('select * from yourtable obder by :sortfieldname');
Parameters.ParamByName('sortfieldname').Value := Column.FieldName;
Open;
end;
end;这样就行!
begin
with query1 do
begin
close;
sql.Clear;
sql.Add('select * from 表名 order by :orderlaber');
parambyname('orderlaber').value:=‘列名’;
open;
end;
end;
begin
adoquery1.filtered :=true ;
adoquery1.Sort:=dbgrid1.selectedfield.FieldName;
end;这样只能进行单击一次进行升序,要是想再单击一次进行降序,再单击一次又是升序。以此类推,该怎么解决呢?
begin
with Table1 do
begin
IndexFieldNames:=Column.FieldName;
end;
end;即可实现任何列的排序