概要
快速實現在Windows應用程序中支持拖拽的TreeView控件
技術描述
TreeView已經提供了支持拖拽的事件
;
ItemDrag: 用戶拖拽TreeNode時觸發
當它發生時
調用DoDragDrop方法初始化拖拽過程
;
DragEnter: 在你初始化拖拽操作後
你必須處理目標TreeView控件的DragEnter事件
這個事件發生在用戶拖拽TreeNode對象從TreeView控件到目標控件范圍點內
DragEnter事件能夠指定目標TreeView控件
無論拖拽操作對這個控件是否用
代碼中僅僅是移動操作
;
DragDrop: 最後是要處理目標TreeView的DragDrop事件
這個事件發生在用戶推拽TreeNode對象並釋放到目標控件中
處理這個事件
返回TreeNode對象並添加到目標TreeView控件上
代碼中用Data對象返回
以下代碼實現一個TreeView控件上拖拽任意節點到指定節點上
也可以自己擴展為多個TreeView控件間TreeNode相互拖拽的程序
Data對象的GetData方法返回被拖拽的TreeNode對象
GetNodeAt方法用來確定這個TreeNode對象拖拽到的目標控件(這裡就是目標TreeNode對象)
在確定位置之後把源TreeNode對象添加到目標TreeNode對象下面
作為其子結點
因為是移動操作
因此最後會把源TreeNode對象刪除掉
通過以下幾步創建實例程序
創建C# Windows應用程序
界面增加一個TreeView控件
設置TreeView的AllowDrop屬性設置為True
Page_Load方法中增加如下代碼
private void Form
_Load(object sender
System
EventArgs e)
{
// TreeView控件增加一些測試節點
TreeNode ParentNode
;
ParentNode
= treeView
Nodes
Add(
tv
);
ParentNode
Nodes
Add(
tv
FirstChild
);
ParentNode
Nodes
Add(
tv
SecondChild
);
ParentNode
Nodes
Add(
tv
ThirdChild
);
ParentNode
Nodes
Add(
tv
FourthChild
);
ParentNode
Expand();
// TreeView控件增加事件
this
treeView
ItemDrag += new System
Windows
Forms
ItemDragEventHandler(this
treeView_ItemDrag);
this
treeView
DragEnter += new System
Windows
Forms
DragEventHandler(this
treeView_DragEnter);
this
treeView
DragDrop += new System
Windows
Forms
DragEventHandler(this
treeView_DragDrop);
}
//treeView_ItemDrag 事件代碼
private void treeView_ItemDrag(object sender
System
Windows
Forms
ItemDragEventArgs e)
{
DoDragDrop(e
Item
DragDropEffects
Move);
}
// treeView_DragEnter事件代碼
private void treeView_DragEnter(object sender
System
Windows
Forms
DragEventArgs e)
{
e
Effect = DragDropEffects
Move;
}
// treeView_DragDrop事件代碼
private void treeView_DragDrop(object sender
System
Windows
Forms
DragEventArgs e)
{
TreeNode NewNode;
if(e
Data
GetDataPresent(typeof(TreeNode)))
{
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
);
DestinationNode
Nodes
Add((TreeNode) NewNode
Clone());
DestinationNode
Expand();
//刪除已經移動的節點
NewNode
Remove();
}
}
From:http://tw.wingwit.com/Article/program/net/201311/11471.html