Entwickler-Ecke

WinForms - TreeView bzw. TreeNodes kopieren - klonen - referenzieren?


Christoph1972 - Di 16.06.09 18:36
Titel: TreeView bzw. TreeNodes kopieren - klonen - referenzieren?
Hallo zusammen,


ich habe mal wieder eine Frage. Und zwar möchte ich ein TreeView bzw. dessen Nodes kopieren oder klonen. Mein erster Versuch war eine Referenz auf das TreeView Control zu legen, also newTreeView = oldTreeView, aber dann fehlen die Nodes. Eine weiter Versuch sieht so aus:

Die Basis Klasse:

C#-Quelltext
1:
2:
3:
TreeNode[] tnc = new TreeNode[myTreeView.Nodes.Count];
myTreeView.Nodes.CopyTo(tnc, 0);
andereKLasse.SetMainTreeView = tnc; // Übergabe an eine andere Klasse


die andere Klasse:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public TreeNode[] SetMainTreeView
{
 set
    {
     subTreeView.Nodes.AddRange(value); // hier gibts dann eine Exeption             
    }
}


Die Exeption: Das Element XYZ kann nur an einer Stelle hinzugefügt oder eingefügt werden. Entfernen Sie es von der aktuellen Position, oder klonen Sie es.

Wie kann das sein? Das TreeView besitzt zu dem Zeitpunkt keine Nodes. Ich denke dass hier meinerseits ein Missverständnis vorliegt. Hat hier jemand einen Tipp für mich, wie vorgehen muss, um eine Kopie eines TreeViews mit allen Nodes und Icons zu erhalten. Ich denke, das kann man dann auch leicht für andere Controls verwenden, oder?


Vielen Dank schon mal!


Gruß
Christoph


JüTho - Di 16.06.09 19:13

Hallo Christoph,

ich sehe nichts davon, dass du wirklich Clone verwendest. Hast du dir das Beispiel in der SDK-Doku/MSDN unter TreeNode.Clone-Methode genau angeschaut?
Zitat:
Wie kann das sein? Das TreeView besitzt zu dem Zeitpunkt keine Nodes. Ich denke dass hier meinerseits ein Missverständnis vorliegt.

Weil es sich um Referenzen handelt, kann offensichtlich ein ganz konkreter TreeNode nur an eine Stelle in einer TreeView existieren und nicht an mehreren Stellen. Das gleiche gilt übrigens auch für jedes einzelne Control.

Zitat:
Hat hier jemand einen Tipp für mich, wie vorgehen muss, um eine Kopie eines TreeViews mit allen Nodes und Icons zu erhalten.

Siehe das o.g. Beispiel.

Zitat:
Ich denke, das kann man dann auch leicht für andere Controls verwenden, oder?

Nein. Es geht nur bei den Elementen, die das Interface IClonable implementiert haben. Welche das sind, findest du z.B. in der SDK-Doku über den Index zur Clone-Methode.

Gruß Jürgen


Kha - Di 16.06.09 19:54

Um was geht es denn, um die Kommunikation zweier Forms? Dann gilt das alte Prinzip: Nicht die Controls, sondern die zugrunde liegenden Daten solltest übergeben.


Christoph1972 - Di 16.06.09 21:44

Hi,


vielen Dank für die schnellen Antworten!

@JüTho
Die Klone Methode hatte ich mir angeschaut. Ich war aber der Meinung, dass ich alle Nodes mit einem Klone übergeben kann. Es gibt auch noch eine TreeNodeCollection damit habe ich es aber auch nicht hinbekommen. Ich werde mir morgen mal die Klone Methode anschauen.


@Kha
Ich benötige in einem Projekt das gleiche TreeView, in zwei verschieden Forms. Ich möchte es nur vermeiden das TreeView in dem zweiten Form zu befüllen. Ich bin der Meinung das eine Kopie des ersten TreeViews reicht, ich bin ja faul :P


Gruß
Christoph


Christoph1972 - Di 16.06.09 21:57

Habe mir gerade die Klone Methode angeschaut. Eine "Lösung" habe ich jetzt, jedoch werden die Icons nicht mit übergeben.


Nemag - Mi 17.06.09 14:21

Servus

jetzt mal ohne das ich mir die Treeview nochmal genauer angeschaut habe

wenn du die Treeview auf eine andere Form kopieren willst - ist dann auf dieser dann die ImageList der anderen Form auch bekannt? Denke du übergibst ja nur Indizes der ImageList - vielleicht fehlt deshalb das Icon.


Christoph1972 - Mi 17.06.09 18:01

So, nun werden alle Nodes nach und nach geklont und dann in eine List<TreeNode> befördert. Die List<> übergebe ich an die andere Klasse. Der Klasse habe ich eine identische ImageList verpasst und nun funktioniert alles so wie gewünscht. Ich dachte hat das es mit einem „Einzeiler“ gehen würde, na ja dann eben nicht :lol:


Vielen Dank an euch!


Gruß
Christoph