在 Visual C# .NET 应用程序中添加树视图拖放功能

树视图控件提供三个您必须处理的拖放事件:
      • ItemDrag: 用户一开始拖动树节点,就会从源树视图控件引发此事件。 发生这种情况时,请调用 DoDragDrop 方法以启动拖放过程。 
     • DragEnter: 启动拖放操作后,必须在目标树视图控件中处理 DragEnter 事件。 当用户将 TreeNode 对象从源树视图控件拖到目标树视图控件边框内某一点时,将发生此事件。 DragEnter 事件允许目标树视图控件指定拖放操作对此控件是否有效。 本文中的代码示例只允许执行移动操作。 
     • DragDrop: 最后一个要处理的事件是目标树视图控件的 DragDrop 事件。 在将拖动的 TreeNode 对象放到目标树视图控件上时,便会发生此事件。 若要处理此事件,请检索出 TreeNode 对象,然后将该对象添加到目标树视图控件中。 代码示例中使用了 Data 对象来检索数据。 
本文中的代码示例确保已将一个 TreeNode 对象拖到目标树视图控件中。 Data 对象的 GetData 方法检索从源控件中拖动的节点。 GetNodeAt 方法确定将此节点拖到目标控件上的什么位置。 确定此位置后,请添加源节点,使其作为目标节点的子节点。 由于本示例中执行一个移动操作,所以最后一步是从原始树视图控件移除源节点。

创建示例的步骤
1. 在 Visual C# .NET 中新建一个 Windows 应用程序。默认情况下将创建 Form1。 
2. 使用工具箱将两个树视图控件添加到 Form1。 默认情况下将创建 TreeView1 和 TreeView2。 
3. 若要允许拖放树视图控件,请在“属性”窗口中将 TreeView1 和 TreeView2 的 AllowDrop 属性更改为 True。 
4. 双击 Form1 以生成 Form1 的 Load 事件的方法处理程序。 添加以下代码,以便用 TreeNode(树节点)对象填充两个 TreeView(树视图)控件并定义事件处理程序: private void Form1_Load(object sender, System.EventArgs e)
  {
   TreeNode ParentNode1;
   TreeNode ParentNode2;

   ParentNode1 = treeView1.Nodes.Add("tv1");
   ParentNode1.Nodes.Add("tv1FirstChild");
   ParentNode1.Nodes.Add("tv1SecondChild");
   ParentNode1.Nodes.Add("tv1ThirdChild");
   ParentNode1.Nodes.Add("tv1FourthChild");
   ParentNode1.Expand();

   ParentNode2 = treeView2.Nodes.Add("tv2");
   ParentNode2.Nodes.Add("tv2FirstChild");
   ParentNode2.Nodes.Add("tv2SecondChild");
   ParentNode2.Expand();
   this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
   this.treeView2.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
   this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
   this.treeView2.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
   this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
   this.treeView2.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
  }
 
5. 添加以下方法处理程序以处理 TreeView1 或 TreeView2 的 ItemDrag 事件,具体取决于拖动操作的方向。 此代码对当前拖动的项启动一个移动操作。 private void treeView_ItemDrag(object sender,
   System.Windows.Forms.ItemDragEventArgs e)
  {
   DoDragDrop(e.Item, DragDropEffects.Move);
  }
 
6. 添加以下方法处理程序以处理 TreeView1 或 TreeView2 的 DragEnter 事件,具体取决于拖动操作的方向: private void treeView_DragEnter(object sender,
   System.Windows.Forms.DragEventArgs e)
  {
   e.Effect = DragDropEffects.Move;
  }
 
7. 将以下方法添加到 Form1 类中,让它紧跟在上一步中添加的方法后面: private void treeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
  {
   TreeNode NewNode;

   if(e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
   {
    Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
    TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
    NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
    if(DestinationNode.TreeView != NewNode.TreeView)
    {
     DestinationNode.Nodes.Add((TreeNode) NewNode.Clone());
     DestinationNode.Expand();
     //Remove Original Node
     NewNode.Remove();
    }
   }
  }

 
8. 生成并运行该项目。 将节点从一个树视图控件拖到另一个树视图控件。 注意,该节点已从源控件移除,并已作为子节点添加到目标控件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值