利用的是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;
谢谢各位大侠

解决方案 »

  1.   

    有个 关于 listview 的例子 自己去整理一下
    在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,可以直接使用。