树视图控件提供三个您必须处理的拖放事件:
• 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. 生成并运行该项目。 将节点从一个树视图控件拖到另一个树视图控件。 注意,该节点已从源控件移除,并已作为子节点添加到目标控件中。