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的时候为了完全显示节点,不必一一点开,建议加上如下代码:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
void
frmDrag_Load(
object
sender, EventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this
.treeView1.ExpandAll();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
要实现TreeView的拖拽功能,首先我们必须将其AllowDrop属性设成true,这样就保证了此TreeView的接点是可以被拖拽的。接下来
我们为TreeView添加3个事件,它们分别是1.ItemDrag事件(当用户开始拖动节点时发生。)2.DragEnter事件(在将对象拖入控件
的边界时发生。)3.DragDrop事件(在完成拖放操作时发生。)
在拖拽时要注意的是:1.目标节点不能为空。2.目标节点不能被拖拽节点本身。3.目标节点不能是被拖拽节点的字节。以下是3个事件的代码:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
Point Position
=
new
Point(
0
,
0
);
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
void
treeView1_ItemDrag(
object
sender, ItemDragEventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DoDragDrop(e.Item, DragDropEffects.Move);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
void
treeView1_DragEnter(
object
sender, DragEventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if
(e.Data.GetDataPresent(
typeof
(TreeNode)))
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
e.Effect
=
DragDropEffects.Move;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
else
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
e.Effect
=
DragDropEffects.None;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
void
treeView1_DragDrop(
object
sender, DragEventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TreeNode myNode
=
null
;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if
(e.Data.GetDataPresent(
typeof
(TreeNode)))
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
myNode
=
(TreeNode)(e.Data.GetData(
typeof
(TreeNode)));
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
else
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
MessageBox.Show(
"
error
"
);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Position.X
=
e.X;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Position.Y
=
e.Y;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Position
=
treeView1.PointToClient(Position);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TreeNode DropNode
=
this
.treeView1.GetNodeAt(Position);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
1.目标节点不是空。2.目标节点不是被拖拽接点的字节点。3.目标节点不是被拖拽节点本身
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if
(DropNode
!=
null
&&
DropNode.Parent
!=
myNode
&&
DropNode
!=
myNode)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TreeNode DragNode
=
myNode;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
将被拖拽节点从原来位置删除。
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
myNode.Remove();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
在目标节点下增加被拖拽节点
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DropNode.Nodes.Add(DragNode);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
如果目标节点不存在,即拖拽的位置不存在节点,那么就将被拖拽节点放在根节点之下
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if
(DropNode
==
null
)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TreeNode DragNode
=
myNode;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
myNode.Remove();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
treeView1.Nodes.Add(DragNode);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
经做过一个Windows Form,需要在TreeView空间中实现拖拽的功能,首先我想介绍一下Windows
Form中的TreeView控件:使用 Windows 窗体 TreeView 控件,可以为用户显示节点层次结构,就像在 Windows
操作系统的 Windows
资源管理器功能的左窗格中显示文件和文件夹一样。树视图中的各个节点可能包含其他节点,称为“子节点”。可以按展开或折叠的方式显示父节点或包含子节点的
节点。通过将树视图的 CheckBoxes 属性设置为 true,还可以显示在节点旁边带有复选框的树视图。然后,通过将节点的 Checked
属性设置为 true 或
false,可以采用编程方式来选中或清除节点。通过以上的说明,你可能对TreeView控件有了一个初步的了解,在本文中我的目的是向大家演示一下在
TreeView中如何实现接点间的拖拽,如何讲一个节点拖拽到另一个节点之下,使其成为目标节点的子节点,同时被拖拽节点的子节点也将一起被拖拽到目标
节点之下,并保持其原来的树状结构。
在Form Load的时候为了完全显示节点,不必一一点开,建议加上如下代码:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
void
frmDrag_Load(
object
sender, EventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
this
.treeView1.ExpandAll();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
要实现TreeView的拖拽功能,首先我们必须将其AllowDrop属性设成true,这样就保证了此TreeView的接点是可以被拖拽的。接下来
我们为TreeView添加3个事件,它们分别是1.ItemDrag事件(当用户开始拖动节点时发生。)2.DragEnter事件(在将对象拖入控件
的边界时发生。)3.DragDrop事件(在完成拖放操作时发生。)
在拖拽时要注意的是:1.目标节点不能为空。2.目标节点不能被拖拽节点本身。3.目标节点不能是被拖拽节点的字节。以下是3个事件的代码:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
Point Position
=
new
Point(
0
,
0
);
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
void
treeView1_ItemDrag(
object
sender, ItemDragEventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DoDragDrop(e.Item, DragDropEffects.Move);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
void
treeView1_DragEnter(
object
sender, DragEventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if
(e.Data.GetDataPresent(
typeof
(TreeNode)))
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
e.Effect
=
DragDropEffects.Move;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
else
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
e.Effect
=
DragDropEffects.None;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
void
treeView1_DragDrop(
object
sender, DragEventArgs e)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TreeNode myNode
=
null
;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if
(e.Data.GetDataPresent(
typeof
(TreeNode)))
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
myNode
=
(TreeNode)(e.Data.GetData(
typeof
(TreeNode)));
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
else
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
MessageBox.Show(
"
error
"
);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Position.X
=
e.X;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Position.Y
=
e.Y;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Position
=
treeView1.PointToClient(Position);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TreeNode DropNode
=
this
.treeView1.GetNodeAt(Position);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
1.目标节点不是空。2.目标节点不是被拖拽接点的字节点。3.目标节点不是被拖拽节点本身
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if
(DropNode
!=
null
&&
DropNode.Parent
!=
myNode
&&
DropNode
!=
myNode)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TreeNode DragNode
=
myNode;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
将被拖拽节点从原来位置删除。
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
myNode.Remove();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
在目标节点下增加被拖拽节点
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DropNode.Nodes.Add(DragNode);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
如果目标节点不存在,即拖拽的位置不存在节点,那么就将被拖拽节点放在根节点之下
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if
(DropNode
==
null
)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
TreeNode DragNode
=
myNode;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
myNode.Remove();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
treeView1.Nodes.Add(DragNode);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
相关文章推荐
- c# winform TreeView控件中实现拖拽的功能
- 【转】c# winform TreeView控件中实现拖拽的功能
- C#控件Picturebox实现鼠标拖拽功能
- C# WinForm实现窗体上控件自由拖动功能示例
- 如何使数据绑定的控件实现“上一条”、“下一条”、“第一条”和“最后一条”的功能?(WinForm, C#)
- WinForm实现简单的拖拽文件到出题的功能(C#)(3)
- C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考
- C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考
- WinForm实现简单的拖拽功能(C#)
- WinForm实现简单的拖拽功能(C#)
- WinForm实现简单的拖拽功能(C#)(2)
- 在Windows TreeView控件中实现拖拽的功能
- C# WINFORM 某些控件实现联想输入功能
- C# WINFORM 某些控件实现联想输入功能
- C# WinForm 实现控件可拖拽
- TreeView控件中实现拖拽的功能
- C#之winform实现文件拖拽功能
- C#实现树型结构TreeView节点拖拽的简单功能(转)
- C# 实现 treeView 控件 拖拽效果
- C#实现外部图片的拖拽到应用程序的简单功能,附全部源码,供有需要的参考