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

 

本文分步演示了如何在 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 中。TreeView1TreeView2 在默认情况下已创建。
  3. 要允许拖放树视图控件,请在“属性”窗口中,将 TreeView1TreeView2AllowDrop 属性更改为 True
  4. 双击 Form1 以为 Form1 的 Load 事件生成方法处理程序。添加以下代码,以使用 TreeNode 对象填充这两个树视图控件,并定义事件处理程序:
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. 添加下面的方法处理程序,以处理 TreeView1TreeView2ItemDrag 事件,具体取决于拖放操作的方向。此代码对当前拖动的项启动一个移动操作。

private void treeView_ItemDrag(object sender,System.Windows.Forms.ItemDragEventArgs e)
{
  DoDragDrop(e.Item, DragDropEffects.Move);

6. 添加下面的方法处理程序,以处理 TreeView1TreeView2DragEnter 事件,具体取决于拖放操作的方向:

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 NodeNewNode.Remove();
}
}
}

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

posted on 2010-10-18 14:28  cjerych  阅读(197)  评论(0)    收藏  举报

导航