如题,从一个TdxTreeList中的拖放到另外一个TdxTreeList中,或者同个TdxTreeList中的拖放,最好有给个例子,小弟是新人,分数不多。

解决方案 »

  1.   

    提供一个类似的例子.将下面代码中的TfcTreeNode替换成dxTreeList中的Node对象,再确定具体的SourceNode,TargetNode对象即可.BeginDrag     开始拖动一个控件
    DragCursor    确定拖动时的鼠标指针
    DragDrop      产生一个OnDragDrop事件
    DragMode      确定拖放是自动控制还是由程序控制
    Dragging      确定控件是否正在被拖动
    onDragDrop    事件,当对象被Drop到某处时触发
    OnDragOver    事件,当对象被拖动经过控件时触发
    OnEndDrag     事件,拖动结束时触发,不论是Drop到某处还是取消拖放
    OnStartDrag   事件,拖动开始时触发 提供一例程:(使用的控件为:1stClass4000中的TFcTreeView)procedure TChildDeptForm.tvDeptsDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    Var
      SourceNode,TargetNode:TfcTreeNode;
      Dept: TDept;
    begin
      inherited;
      //拖动停止
      TargetNode := tvDepts.GetNodeAt(x,y);
      if TargetNode <> nil then
      Begin
          SourceNode := tvDepts.Selected;
          
          Dept := TDept.Create;
          Try       
            Dept.UpdateParent(SourceNode,TargetNode);
          finally
            Dept.Free;
          end;
          SourceNode.MoveTo(TargetNode,tfcNodeAttachMode(2));
          tvDepts.Selected :=TargetNode;
      end;
    end;procedure TChildDeptForm.tvDeptsDragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    Var
      TargetNode,SourceNode: TfcTreeNode;
    begin
      inherited;
      //拖动经过
      //目标节点
      TargetNode := tvDepts.GetNodeAt(x,y);
      if (Source=Sender) and (TargetNode <> nil) then
      Begin
          Accept := True;
          SourceNode := tvDepts.Selected;
          while (TargetNode.Parent <> nil ) and (TargetNode <> SourceNode ) do
            TargetNode := TargetNode.Parent;
          if TargetNode = SourceNode then
            Accept := False;
      end else
        Accept := False;
    end;
      

  2.   

    TO lqwxfdwj:
     
       我改过后的代码如下:procedure TForm1.dxTreeListDragOver(Sender, Source: TObject; X, 
    Y: Integer; State: TDragState; var Accept: Boolean); 
    begin 
    inherited; 
    //拖动经过 
    //目标节点 
    if (SelectNode <> nil) AND ((Sender=Source) or (TdxTreeList(Source) = dxTreeList_1)) then 
    Accept := True 
    else 
    Accept := False; 
    end; procedure TForm1.dxTreeListDragDrop(Sender, Source: TObject; X, 
    Y: Integer); 
    var 
    CurMouseAtNode: TdxTreeListNode; 
    begin 
    inherited; 
    CurMouseAtNode:=dxTreeList.GetNodeAt(X,Y); //取得目标树中鼠标当前所在的节点,用以确定拖放节点插入的位置
    //拖动停止 
    if SelectNode <> nil then 
    Begin 
    With dxTreeList.Insert(CurMouseAtNode) do //在CurMouseAtNode之前插入拖放的节点
    begin 
    Values[0]:= SelectNode.Values[0]; 
    end; 
    if Sender=Source then       //如果源树=目标树,则在插入拖放节点后,需要将原来的节点删除
    SelectNode.Free; 
    end; 
    end; procedure TForm1.dxTreeListMouseDown(Sender: TObject; 
    Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    begin 
    SelectNode:=dxTreeList.GetNodeAt(X,Y); //取得目标树中选择的节点,并保存起来
    end; procedure TForm1.dxTreeList_1MouseDown(Sender: TObject; 
    Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    begin 
    SelectNode:=dxTreeList_1.GetNodeAt(X,Y); //取得源树中选择的节点,并保存起来
    end; 代码说明:1、SelectNode是一个全局变量,用来保存要拖放的节点,感觉这样做不是很好,有更好的办法来保存当前拖放的是哪个节点吗?
              2、dxTreeList是目标树,dxTreeList_1是源树,在目标树dxTreeList内也要允许拖放(这样用户就能方便的调节各个节点的顺序了)因为第一次也这样的效果,所以对代码不是很有把握,希望下面的大侠能给点宝贵的意见。
      

  3.   

    有几个问题:
    1:源和目标中的selectNode应该分别定义两个节点,不然的话,在拖放结束后,源节点的值被目标节点改变.
    2:在目标结节中没有考虑目标里面是空的情况.如果treelist2为空的话,上面的代码好像就形成了什么也没有拖进去.
    3:选择源节点:在BeginDragNode(Sender: TObject; Node: TdxTreeListNode);中取值;SourceNode:=Node;
    4:好像你拖完后还要比较目标节点与源结点.有一个问题没有确定,A:是要求目标节点跟源节点始终保持一致?即目标节点比源节点的项数多就删除?如果源节点比目标节点多就添加?这样子的话在拖放完成后还要对目标节点与源节点进行对比.感觉很麻烦.如果真的有这样的情况发生的话,在数据库中对添加的节点实时保存到数据库,存在时放弃,不存在就添加.然后再反高对比.
      

  4.   

    小弟用了很多时间, 搞了www.kingofcoder.com编程王网站, 请大家支持一下.
    这站已经用了我很多钱买伺服器了,希望能够搞一个出名的编程资源网
    谢谢  
      

  5.   

    小弟用了很多时间, 搞了www.kingofcoder.com编程王网站, 请大家支持一下.
    这站已经用了我很多钱买伺服器了,希望能够搞一个出名的编程资源网
    谢谢