none
Drag and Drop mit TreeView RRS feed

  • Frage

  • Hallo Forum,

    habe eine Form a in der ich 2 TreeViews habe. Nun möchte ich einzelne Knoten von TreeView 1 nach TreeView2 mit Drag and Drop kopieren. Dabei sollten aber keine Knoten doppelt angelegt werden. Ausserdem sollen die Knoten nach Möglichkeit auch in andere "Unterknoten" kopiert werden können. Wie muss man dabei vorgehen ? Die Knoten in TreeView2 sollten auch per Drad And Drop wieder löschbar sein. Alle Informationen aus dem Knoten von TreeView1 müssen auch in TreeView2 vorhanden sein.

    Hat mir da jemand ein Hanhaltspunkt wie man das machen kann ?

    Danke.

      


    Gruß Roland
    Montag, 25. Oktober 2010 12:43

Antworten

  • Hallo Roland,

    da Du keinerlei Informationen über die Art der Daten im TreeView geliefert hast,
    habe ich mal etwas mit Dateien zusammengestellt.
    Voraussetzung ist ein Formular mit zwei TreeViews (leftTreeView, rightTreeView)
    an die eine ImageList (fileImageList) gebunden wird, das 3 Bitmaps enthält:
    Verzeichnis, Verzeichnis offen, Datei - was nur der Optik halber ist.
    Die ImageList selbst wird nicht im gezeigten Code angesprochen,
    sondern nur der ImageIndex zur Unterscheidung bei den Operationen eingesetzt.

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.IO;
    
    namespace ElmarBoye.Samples.Forms
    {
      public partial class TreeViewDragDropForm : Form
      {
        // Indizes für ImageList (fileImageList
        const int FolderImageIndex = 0;
        const int FolderSelectedImageIndex = 1;
        const int FileImageIndex = 2;
    
        public TreeViewDragDropForm()
        {
          // zwei TreeViews (leftTreeView, rightTreeView) und dazu eine ImageList (fileImageList)
          InitializeComponent();
    
          // Ereignisbehandlung für die beiden TreeViews
          this.leftTreeView.AllowDrop = true;
          this.leftTreeView.MouseDown += TreeViewMouseDown;
          this.leftTreeView.DragOver += TreeViewDragOver;
          this.leftTreeView.DragDrop += TreeViewDragDrop;
    
          this.rightTreeView.AllowDrop = true;
          this.rightTreeView.MouseDown += TreeViewMouseDown;
          this.rightTreeView.DragOver += TreeViewDragOver;
          this.rightTreeView.DragDrop += TreeViewDragDrop;
    
          // Formular dient als "Löschziel" 
          this.AllowDrop = true;
          this.DragOver += FormDragOver;
          this.DragDrop += FormDragDrop;
        }
    
        private void TreeViewDragDropForm_Load(object sender, EventArgs e)
        {
          // Dateien (hier Bilder) einfügen
          FillTreeView(this.leftTreeView, Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));
    
          // Knoten als erstes Ziel
          this.rightTreeView.Nodes.Add(new TreeNode("Ziel", FolderImageIndex, FolderSelectedImageIndex));
        }
    
        #region Form DragDrop
        private void FormDragOver(object sender, System.Windows.Forms.DragEventArgs e)
        {
          TreeNode sourceNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
          e.Effect = DragDropEffects.None;
          if (sourceNode != null)
          {
            // "Löschen" nur wenn vom rechten TreeView stammend 
            if (sourceNode.TreeView == this.rightTreeView)
            {
              // Nicht für den ersten Knoten (dann geht nix mehr)
              if (sourceNode != this.rightTreeView.Nodes[0])
              {
                e.Effect = DragDropEffects.Move;
              }
            }
          }
        }
    
        private void FormDragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
          TreeNode sourceNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
          if (sourceNode != null)
          {
            // "Löschen" nur wenn vom rechten TreeView stammend 
            if (sourceNode.TreeView == this.rightTreeView)
            {
              sourceNode.Remove();
              e.Effect = DragDropEffects.Move;
            }
          }
        }
        #endregion
    
        #region TreeView DragDrop
        private void TreeViewMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
          TreeView treeView = (TreeView)sender;
          TreeNode node = treeView.GetNodeAt(e.X, e.Y);
          treeView.SelectedNode = node;
          if (node != null)
          {
            treeView.DoDragDrop(node, DragDropEffects.Move);
          }
        }
    
        private void TreeViewDragOver(object sender, System.Windows.Forms.DragEventArgs e)
        {
          TreeView treeView = (TreeView)sender;
          TreeNode sourceNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
    
          e.Effect = DragDropEffects.None;
          if (sourceNode != null)
          {
            // Verschieben nur zwischen den beiden TreeViews
            if (sourceNode.TreeView != treeView)
            {
              Point point = treeView.PointToClient(new Point(e.X, e.Y));
              TreeNode targetNode = treeView.GetNodeAt(point);
              if (targetNode != null)
              {
                e.Effect = DragDropEffects.Move;
                treeView.SelectedNode = targetNode;
              }
            }
          }
        }
    
        private void TreeViewDragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
          TreeView treeView = (TreeView)sender;
          // Ziel bestimmen
          Point point = treeView.PointToClient(new Point(e.X, e.Y));
          TreeNode targetNode = treeView.GetNodeAt(point);
    
          TreeNode sourceNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
          if (targetNode != null && sourceNode != null)
          {
            // Löschen in Quelle
            sourceNode.Remove();
            // Ziel ist ein Verzeichnis
            if (targetNode.ImageIndex == FolderImageIndex)
            {
              // Anhängen an Ziel
              targetNode.Nodes.Add(sourceNode);
              // Knoten expandieren
              targetNode.Expand();
            }
            else
            {
              // An Position des Ziels einfügen
              targetNode.Parent.Nodes.Insert(targetNode.Index, sourceNode);
            }
          }
        }
        #endregion
    
        #region Initialisierung (Dateien)
        private void FillTreeView(TreeView treeView, string folder)
        {
          treeView.BeginUpdate();
          try
          {
            treeView.Nodes.Clear();
    
            treeView.Nodes.Add(EnumDirectory(folder));
    
          }
          finally
          {
            treeView.EndUpdate();
          }
        }
    
        private TreeNode EnumDirectory(string folder)
        {
          var directoryNode = new TreeNode(Path.GetFileName(folder), FolderImageIndex, FolderSelectedImageIndex);
          try
          {
            foreach (var directoryName in System.IO.Directory.EnumerateDirectories(folder))
            {
              directoryNode.Nodes.Add(EnumDirectory(Path.Combine(folder, directoryName)));
            }
          }
          catch (UnauthorizedAccessException) {}
          
          try
          {
            // Bilddateien einfügen
            foreach (var fileName in System.IO.Directory.EnumerateFiles(folder, "*.jpg"))
            {
              directoryNode.Nodes.Add(new TreeNode(Path.GetFileName(fileName), FileImageIndex, FileImageIndex));
            }
          }
          catch (UnauthorizedAccessException) {}
          return directoryNode;
        }
        #endregion
      }
    }
    
    
    Gruß Elmar

     

    Mittwoch, 27. Oktober 2010 10:18