TreeView 拖動排序


  曾經做過一個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(00);

        
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);
            }

        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章