Drag & Drop innerhalb eines Treeviews



  • Hallo Leute,
    hat schon mal jemand die Nodes eines Treeviews mittels Drag & Drop verschoben? Werd grad nicht so richtig schlau aus der Hilfe, vielleicht gibt's ja einen Tipp *hoff*. Im Moment hab ich den Kreis mit Schrägstrich, wenn ich einen Node wegziehen will, kann ihn also nirgendwo fallenlassen, weil alles verboten ist. Der Treeview hat ein TRUE im AllowDrop, was gibt es noch zu beachten?



  • ich habe ein kleines bsp gebastelt.
    in dem bsp werden knoten innerhalb gleicher treeview mit der mouse bei gedruckter linker mousetaste verschoben oder kopiert. ist zusätzlich noch die strg-taste gedruckt, wird ein node kopiert.

    für das bsp muss du AllowDrop auf true setzen und ItemDrag, DragDrop und DragOver ereignisse behandeln

    private void treeView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
    {
    	if (e.Button == MouseButtons.Left)
    	{
    		DoDragDrop(e.Item, DragDropEffects.All);
    	}
    }
    
    private void treeView1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
    {
    	Point p = treeView1.PointToClient(new Point(e.X, e.Y));
    	// prüfen, ob die mouse sich über einem node befindet
    	TreeNode node = treeView1.GetNodeAt(p.X, p.Y);
    	if (node != null)
    	{
    		// nur Nodes zum Drag&Drop zulassen user dem der gezogen wird
    		// RootNode ausschließen
    		object o = e.Data.GetData("System.Windows.Forms.TreeNode");
    		if (o != null && !node.Equals(o) && !treeView1.Nodes[0].Equals(o))
    		{
    			// wenn STRG gedruckt ist, dann CopyMode aktivieren
    			if ((e.KeyState & 8) == 8) 
    				e.Effect = DragDropEffects.Copy;
    			else
    				e.Effect = DragDropEffects.Move;
    		}
    		else
    			e.Effect = DragDropEffects.None;
    	}
    	else
    		e.Effect = DragDropEffects.None;
    }
    
    private void treeView1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    {
    	Point p = treeView1.PointToClient(new Point(e.X, e.Y));
    	// Zielnode
    	TreeNode targetnode = treeView1.GetNodeAt(p.X, p.Y);
    	// Quellnode
    	TreeNode sourcenode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
    	// neuen Knoten clonen aus dem sourcenode
    	if (e.Effect == DragDropEffects.Copy || e.Effect == DragDropEffects.Move)
    	{
    		TreeNode node = (TreeNode)sourcenode.Clone();
    		targetnode.Nodes.Add(node);
    	}
    	// sourcenode entfernen
    	if (e.Effect == DragDropEffects.Move)
    	{
    		sourcenode.Remove();
    	}
    }
    

    viel spass damit



  • Danke erstmal, sieht schon gut aus *freu*
    Ich werde aber erst morgen Abend dazu kommen, das auszutesten.



  • Nochmal Danke - funktioniert prima 🙂
    Jetzt werde ich mir das noch im Detail zu Gemüte führen, damit ich auch was lerne 😉


Anmelden zum Antworten