TreeNodeCollection überführen...

yesso

Mitglied
TreeNodeCollection überführen... Fehler im Steuerelement !

Hi,

versuche die Baumstruktur aus dem TreeView in meiner Form1 in die TreeView aus meiner Form2 zu überführen undzwar ohne for oder while schleife, habe folgendes versucht:

Form1 hat folgende Methode um eine Kopie der Baumstruktur zu geben:
public TreeNode[] GetTNC()
{
TreeNode[] tncArray = new TreeNode[3]; //sind nur 3 knoten, ist ja auch nur ein test...
this.treeView1.Nodes.CopyTo(tncArray,0);
return (TreeNode[])tncArray.Clone();
}

Form2 wird danach aufgerufen und auf Button-Klick soll es die Knoten im TreeView aufbauen:
privatevoid button1_Click(object sender, System.EventArgs e)
{
Form1 f = new Form1();
TreeNode[] node = f.GetTNC();
this.treeView1.Nodes.AddRange(node);
}

Das geile an der Sache ist, das die Knoten nicht gezeichnet werden aber über Debug kann ich sehen das die Knoten zum TreeView hinzugefügt worden sind...

Was mache ich falsch oder ist das ein Fehler im Steuerelement, denn auch die Methodenabfolge: BeginUpdate(), dan einfügen der Knoten durch AddRange() und dann wieder EndUpdate() helfen nicht, oder nach dem einfügen Update() oder Refresh() zum neuzeichnen helfen auch nicht !

Ich bekomme die Knoten einfach nicht angezeigt/gezeichnet obwohl dem TreeView zugeordnet werden...

mfG
yesso


 
Zuletzt bearbeitet:
Hi,

wie erstellst du denn das TreeView in deiner Form1? In deinem buttonClick-Event der Form2 erstellst du naemlich immer eine neue Instanz der Form1 anstatt die Referenz der bereits bestehenden zu uebergeben.
Hat das TreeView nun immer einen festen Start-Wert der beim Instanzieren der Form1 erstellt wird oder wird es anders aufgebaut evtl. durch einen Methodenaufruf?
 
Die TreeView in Form1 hab ich mit dem Designer aufgebaut, also TreeView aus der Toolbox auf Form1 gezogen und im Eigenschaftsfenster mit Knoten gefüllt...d.h. es ist zu begin der Applikation bereits mit Knoten gefüllt...

Warum ich die Form1 beim Button in Form2 nochmal instanziire? na damit ich auf die Methode GetTNC(); zugreifen kann...oder was meinst du...?
 
Ja, dann hast du die Form1 aber zweimal im Speicher .. sprich die zweite Instanz hat mit der ersten nichts zu tun.

Du musst die Form1 an die Form2 übergeben.

Hierzu baust du einfach eine eigene Membervariable in Form2

Code:
private Form1 form1 = null;
Dann musst du den Konstruktor umbauen:
Code:
public Form2(Form1 f) {
   form1 = f;
}
Nun kannst du in den anderen Methoden der Form2 auf form1 zugreifen und bist direkt auf der Form1.

Jetzt vereinfacht ausgedrückt.

Den Aufruf der Form2 musst du dann natürlich verändern:
Code:
Form2 form2 = new Form2(this);
form2.Show();
 
Danke, du hattest Recht...

Der Debugger hat mich die ganze Zeit in die Pfanne gehauen, weil ja bei der neuen Instanz natürlich die Knoten auch sofort da sind...

Hab das jetzt so gemacht wie du es gesagt hast, also Form1 der Form2 als Parameter im Konstruktor übergeben...

und dann folgendes in Form2 auf Button-Klick:

privatevoid button1_Click(object sender, System.EventArgs e)
{
TreeNode[] node = this.f1.GetTNC();
this.treeView1.Nodes.AddRange(node);
}

Obwohl ich in Methode GetTNC(); das TreeNode[] Klone und zurückgebe kommt folgende Fehlermeldung:

Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' ist in system.windows.forms.dll aufgetreten.
Zusätzliche Informationen: Das Element "Knoten0" kann nur an einer Stelle hinzugefügt oder eingefügt werden. Entfernen Sie es von der aktuellen Position oder klonen Sie es.

Habs auch mit mehrfachem Klonen des TreeNode[] versucht aber immer der gleiche Fehler! Was mache ich falsch? Oder ist hier wirklich ein Fehler im Steuerelement?
 
Danke für die Tut, aber wollt mal bescheid geben das ich über den Link nicht zugreifen kann. Ich soll wohl keine Rechte dafür haben...

Und unter Tutorials - Inbox sind keine einträge oder kann bloß ich sie nicht sehen?
 
also über eine enumerator ist das ganze ist einfacher als ich es wahr haben wollte...

einfach wie oben beschrieben die referenz auf die form1 der form2 mit übergeben und dann auf button-klick folgendes ausführen:

privatevoid button1_Click(object sender, System.EventArgs e)
{
IEnumerator en = this.f1.GetTNC().GetEnumerator();
while(en.MoveNext())
{
TreeNode node = (TreeNode) en.Current;
this.treeView1.Nodes.Add((TreeNode)node.Clone());
}
}

und schon ist die gesamt baumstruktur drin ;)
VIELEN DANK FÜR EURE HILFE
 
Zurück