利用的是clientdataset连接TTable空间,然后连接到DBgrid里进行显示,现在想对DBgrid里的每一列进行升降序排列,要求是点击一列一次升序排列,再点击降序排列,不想用第三方控件,网上找了一些有说用addindex,但是试了很久也不行,代码如下:
flag为全局变量,初始为true
procedure TForm1.rid1TitleClick(Column: TColumn);
begin
if(flag = True) then
begin
ClientDataSet1.AddIndex(Column.FieldName,Column.FieldName,[ixPrimary]);
ClientDataSet1.IndexName := Column.FieldName;
flag := not flag;
end
else
begin
ClientDataSet1.AddIndex(Column.FieldName,Column.FieldName,[ixDescending]);
ClientDataSet1.IndexName := Column.FieldName;
flag := not flag;
end;
end;
谢谢各位大侠
flag为全局变量,初始为true
procedure TForm1.rid1TitleClick(Column: TColumn);
begin
if(flag = True) then
begin
ClientDataSet1.AddIndex(Column.FieldName,Column.FieldName,[ixPrimary]);
ClientDataSet1.IndexName := Column.FieldName;
flag := not flag;
end
else
begin
ClientDataSet1.AddIndex(Column.FieldName,Column.FieldName,[ixDescending]);
ClientDataSet1.IndexName := Column.FieldName;
flag := not flag;
end;
end;
谢谢各位大侠
在ListView的OnColumnClick事件里:
procedure TMainForm.SortLVColClick(Sender: TObject;
Column: TListColumn);
const
OrderStr: array[1..2] of String =
('↑','↓');
var
ListView: TListView;
OldOrderColumn: TListColumn;
begin
ListView := (Sender as TListView);
if ListView.Tag = Column.Index then
begin
case Column.Tag of
1, 2:
begin
Column.Tag := 3 - Column.Tag;
Column.Caption :=
LeftStr(Column.Caption,
Length(Column.Caption) - Length(OrderStr[2]));
end;
0: Column.Tag := 1;
end;
end
else if ListView.Tag >= 0 then
begin
OldOrderColumn := ListView.Column[ListView.Tag];
case OldOrderColumn.Tag of
1: OldOrderColumn.Caption :=
LeftStr(OldOrderColumn.Caption,
Length(OldOrderColumn.Caption) - Length(OrderStr[1]));
2: OldOrderColumn.Caption :=
LeftStr(OldOrderColumn.Caption,
Length(OldOrderColumn.Caption) - Length(OrderStr[2]));
end;
end;
if Column.Tag = 0 then
Column.Tag := 1;
Column.Caption := Column.Caption + OrderStr[Column.Tag];
ListView.Tag := Column.Index;
ListView.AlphaSort;
end;在ListView.OnCompare事件中:
procedure TMainForm.ListViewCompare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
var
ListView: TListView;
OrderBy: Integer;
OrderType: Integer;
Str1, Str2: String;
begin
ListView := (Sender as TListView);
OrderBy := ListView.Tag;
if OrderBy >= 0 then
begin
OrderType := ListView.Column[OrderBy].Tag;
if OrderBy = 0 then
begin
Str1 := Item1.Caption;
Str2 := Item2.Caption;
end
else
begin
if OrderBy <= Item1.SubItems.Count then
Str1 := Item1.SubItems[OrderBy - 1]
else
Str1 := '';
if OrderBy <= Item2.SubItems.Count then
Str2 := Item2.SubItems[OrderBy - 1]
else
Str2 := '';
end;
case OrderType of
1: Compare := AnsiCompareText(Str1, Str2);
2: Compare := AnsiCompareText(Str2, Str1);
end;
end;
end;事先要把ListView的Tag属性设为-1
以上代码在访问ListView时都使用了Sender,可以直接使用。