曾經做過一個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);
}
}現在你可以就可以運行看下效果拉,感覺還不錯吧,呵呵。