listview的各行中包含imageindex、caption、sublistitem等属性,要求两行完全互换(实现listitem得上移下移功能)

解决方案 »

  1.   

    这是我程序里的一代,包括更新数据库:
    Var
      ts: TListItem;
      dataid:pdatanode;
      tdc,tds1,tds2,tsc,tss1,tss2,pxsql:string;
      movid,m:integer;begin
      if rzlistview1.Selected<>nil then
      begin
        j:=rzlistview1.Items.Count;
        if j<>0 then
        begin
          ts:=rzListView1.Selected;
          rzListView1.SetFocus;
          i:=ts.Index;
          if i<j-1 then
          begin
            tsc:= rzlistview1.Items[i].Caption;
            tss1:=rzlistview1.Items[i].SubItems[0];
            tss2:=rzlistview1.Items[i].SubItems[1];
            rzlistview1.Refresh;
            rzListView1.Items[i+1].Selected:=true;
            rzListView1.SetFocus;
            tdc:=rzlistview1.Items[i+1].Caption;
            tds1:=rzlistview1.Items[i+1].SubItems[0];
            tds2:=rzlistview1.Items[i+1].SubItems[1];
            rzlistview1.Items[i+1].Caption:=tsc;
            rzlistview1.Items[i+1].SubItems[0]:=tss1;
            rzlistview1.Items[i+1].SubItems[1]:=tds2;
            rzlistview1.Items[i].Caption:=tdc;
            rzlistview1.Items[i].SubItems[0]:=tds1;
            rzlistview1.Items[i].SubItems[1]:=tss2;
          end;
        end;
        dataid:=rztreeview1.Selected.Data;
        movid:=integer(dataid.ID);
    {    Datamodule3.ADOTable2.Filtered :=true;
        Datamodule3.ADOTable2.Filter := 'sxparent='+inttostr(movid);
        Datamodule3.ADOTable2.Sort:='sxsort';
        datamodule3.ADOTable2.First;}
        pxsql:='select * from zbtable where sxparent='+inttostr(movid);
        With DataModule3.ADOQuery1 Do
        Begin
          Close;
          SQl.Clear;
          SQl.add(pxsql);
          open;
        End;
        DataModule3.ADOQuery1.Sort:='sxsort';
        for m:=0 to rzlistview1.Items.Count-1 do
        begin
          DataModule3.ADOQuery1.Locate('id',rzlistview1.Items[m].Caption,[lopartialkey]);
          datamodule3.ADOQuery1.Edit;
          datamodule3.ADOQuery1.FieldByName('sxsort').value:=strtoint(rzlistview1.Items[m].SubItems[1]);
          datamodule3.ADOQuery1.Post;
        end;
      end;
    end;
      

  2.   

    如果用逐列值交换的方法当然也可以实现,但是有没有更直接的办法?
    我试过用一个TempItem(TListItem)直接给两行赋值互换,但很奇怪的是最后两行总是变成一样的,是否TempItem:=ListView1.selected这种写法得到的是一个类似指针变量的东西??
      

  3.   

    A example to your email.
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
    Dialogs,
      ComCtrls;type
      TForm1 = class(TForm)
        ListView1: TListView;
        procedure ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
        procedure ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
          State: TDragState; var Accept: Boolean);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        DragItem, TargetItem:TListItem;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y:
    Integer);
    var
      TargetIndex: integer;
    begin
      DragItem := ListView1.Selected;
      TargetIndex := ListView1.DropTarget.Index;
      if TargetIndex>DragItem.Index then
      TargetItem:=ListView1.Items.Insert(TargetIndex+1)
      else TargetItem:=ListView1.Items.Insert(TargetIndex);
      TargetItem.Assign(DragItem);
      DragItem.Delete;
    end;procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      if Source=ListView1 then accept :=true;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ListView1.DragMode := dmAutomatic;
      ListView1.ViewStyle := vsList;
    end;end.使用鼠标拖动更快!
    http://www.bwkj.net/Bios/Ddgg_soarn.ace是我做的事例
      

  5.   

    To visual_cjiajia:万分感谢!!