您的位置:首页 > 编程语言 > C#

c# winform TreeView控件中实现拖拽的功能

2010-10-15 14:53 609 查看

经做过一个Windows Form,需要在TreeView空间中实现拖拽的功能,首先我想介绍一下Windows
Form中的TreeView控件:使用 Windows 窗体 TreeView 控件,可以为用户显示节点层次结构,就像在 Windows
操作系统的 Windows
资源管理器功能的左窗格中显示文件和文件夹一样。树视图中的各个节点可能包含其他节点,称为“子节点”。可以按展开或折叠的方式显示父节点或包含子节点的
节点。通过将树视图的 CheckBoxes 属性设置为 true,还可以显示在节点旁边带有复选框的树视图。然后,通过将节点的 Checked
属性设置为 true 或
false,可以采用编程方式来选中或清除节点。通过以上的说明,你可能对TreeView控件有了一个初步的了解,在本文中我的目的是向大家演示一下在
TreeView中如何实现接点间的拖拽,如何讲一个节点拖拽到另一个节点之下,使其成为目标节点的子节点,同时被拖拽节点的子节点也将一起被拖拽到目标
节点之下,并保持其原来的树状结构。

    在Form Load的时候为了完全显示节点,不必一一点开,建议加上如下代码:


        
private
 void
 frmDrag_Load(
object
 sender, EventArgs e)





        



{



            
this
.treeView1.ExpandAll();



        }

   

要实现TreeView的拖拽功能,首先我们必须将其AllowDrop属性设成true,这样就保证了此TreeView的接点是可以被拖拽的。接下来
我们为TreeView添加3个事件,它们分别是1.ItemDrag事件(当用户开始拖动节点时发生。)2.DragEnter事件(在将对象拖入控件
的边界时发生。)3.DragDrop事件(在完成拖放操作时发生。)

    在拖拽时要注意的是:1.目标节点不能为空。2.目标节点不能被拖拽节点本身。3.目标节点不能是被拖拽节点的字节。以下是3个事件的代码:


        
private
 Point Position 
=
 new
 Point(
0

0
);





        
private
 void
 treeView1_ItemDrag(
object
 sender, ItemDragEventArgs e)





        



{



            DoDragDrop(e.Item, DragDropEffects.Move);



        }





        
private
 void
 treeView1_DragEnter(
object
 sender, DragEventArgs e)





        



{



            
if
 (e.Data.GetDataPresent(
typeof
(TreeNode)))



                e.Effect 
=
 DragDropEffects.Move;



            
else



                e.Effect 
=
 DragDropEffects.None;



        }





        
private
 void
 treeView1_DragDrop(
object
 sender, DragEventArgs e)





        



{



            TreeNode myNode 
=
 null
;



            
if
 (e.Data.GetDataPresent(
typeof
(TreeNode)))





            



{



                myNode 
=
 (TreeNode)(e.Data.GetData(
typeof
(TreeNode)));



            }



            
else





            



{



                MessageBox.Show(
"
error
"
);



            }



            Position.X 
=
 e.X;



            Position.Y 
=
 e.Y;



            Position 
=
 treeView1.PointToClient(Position);



            TreeNode DropNode 
=
 this
.treeView1.GetNodeAt(Position);



            
//
 1.目标节点不是空。2.目标节点不是被拖拽接点的字节点。3.目标节点不是被拖拽节点本身



            
if
 (DropNode 
!=
 null
 &&
 DropNode.Parent 
!=
 myNode 
&&
 DropNode 
!=
 myNode)





            



{



                TreeNode DragNode 
=
 myNode;



                
//
 将被拖拽节点从原来位置删除。



                myNode.Remove();



                
//
 在目标节点下增加被拖拽节点



                DropNode.Nodes.Add(DragNode);



            }



            
//
 如果目标节点不存在,即拖拽的位置不存在节点,那么就将被拖拽节点放在根节点之下



            
if
 (DropNode 
==
 null
)





            



{



                TreeNode DragNode 
=
 myNode;



                myNode.Remove();



                treeView1.Nodes.Add(DragNode);



            }



        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  winform c# windows 编程 null