Benutzer mit den meisten Antworten
Drag and Drop mit TreeView

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
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.Gruß Elmarusing 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 } }
- Als Antwort vorgeschlagen Robert Breitenhofer Donnerstag, 28. Oktober 2010 06:51
- Als Antwort markiert Robert Breitenhofer Montag, 1. November 2010 19:43