排序(20分)

  • 主题发起人 主题发起人 kenmen
  • 开始时间 开始时间
K

kenmen

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用dbgrid实现象‘我的电脑‘中当用‘详细资料’浏览时,按上面的标题实现排序的
方法。应该怎做?
谢!
 
order by 字段
 
这我知,我事想问怎样实现那种‘按‘的功能。
 
可以参考ListView的帮助(以下代码来自Delphi的帮助)
This example shows how to use the OnColumnClick and OnCompare events of
a list view to let users sort the columns in a report-style list view by
clicking on the column headers. This requires a global variable to keep
track of the column that was clicked:

var ColumnToSort: Integer;

The OnColumnClick event handler sets the global variable
to indicate the column to sort and calls AlphaSort:

procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);

begin
ColumnToSort := Column.Index;
(Sender as TCustomListView).AlphaSort;
end;


The OnCompare event handler causes the list view to sort
on the selected column:

procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
var
ix: Integer;
begin
if ColumnToSort = 0 then
Compare := CompareText(Item1.Caption,Item2.Caption)
else begin
ix := ColumnToSort - 1;
Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
end;

end;

Note: This OnCompare event handler uses the global CompareText
function. An application may want to use AnsiCompareText, CompareStr,
or AnsiCompareStr instead, depending on whether the comparison should
be case-sensitive and whether the locale should be considered.
 
dbgrid 中有 OnTitleClick 事件,具体实现是在 OnTitleClick 中进行修改 query的sql语句,在SQL语句中加入相应的“ORDER BY 列名或字段名”。
 
同意archie的
当然你得用QUERY,在把GRID的字段TITLEBUTTOU设为TRUE再用SQL语句就行了
 
利用dbgrid 的 OnTitleClick 事件,下面是对Query排序的通用过程
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;
 
我是想实现ListView的那种按下去的风格,好像dbgrid做不到。
OnTitleClick只是整个title来说的,不能实现单个column的风格。
但用listview好像又不能连数据库。怎办?
 
没人了吗?
 
楼上的人能再说说吗???
谢了!!
 
用ExpressQuantumGrid可以比较容易的半到.可以到http://www.inprises.com/去下载
 
要有按下的效果,建议用第三方控件,如RxLib中的dbgrid就很不错,将其
属性titleButttons设为true就可以了,至于如何排序楼上的已经说的很清楚了
还有就是可以通过建立Index来排序,如果字段是固定的用这个更简单。
 
排序的方法我大概懂得,就是不明我的第二个问题。
若delphi本身的控件做不到,就只好用第三方了。。。。。
delphi本身的控件真的做不到嘛?
 
OnTitleClick只是整个title来说的,不能实现单个column ?
看看它的申明:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
其中 Column参数就是指当前点击的列标题。

Column.FieldName 就可以得到当前列的字段名。然后你再Order by 它不就行了。
 
这里有点代码一个很简单的东西,应该可以看的懂的吧
procedure Tmdi_papers.DBGrid1TitleClick(Column: TColumn);
begin
if column=DBGrid1.Columns[0] then
begin
with adoquery1 do
begin
close;
sql.clear;
sql.Add('select * from aaa');//假如说这里的表是aaa其中的一个字段名为Number
sql.add('order by Number');
open;
end;
end;
if column==DBGrid1.Columns[1] then
........
 
多人接受答案了。
 
后退
顶部