Hallo zusammen
In meiner Frage geht darum treeview nodes von Form1 nach Form2 zu kopieren.
Die Fragen in diesem Forum bezüglich der Kommunikation zweier oder mehrerer Forms
untereinander hab ich schon gelesen...aber irgendwie... X(.
Naja da hab ich mir gedacht nimm doch einfach mal das object:
Form1:
object tVmiseCon = treeView1.Nodes;
aber dann funktioniert die Implizite Konvertierung nicht
Form2:
treeView1.Nodes = tVmiseCon1;
lacht da jemand? 🙁
Bitte seid so lieb und helft mir weiter
Um was wirklich Neues zu erschaffen muss man das Rad neu erfinden
Hi x-sharp!
Glaub nicht, daß dich hier wegen dieser Frage wer auslacht. Ich progge C# zwar noch nicht lange (6 Monate) aber auch in den 6 Monaten intensivstem Training kommt mir noch so einiges spanisch vor.
Also, zu deiner Frage: Der Datentype den du suchst, ist die Klasse "TreeNodeCollection" im Namespace System.Windows.Forms.
Die "Nodes"-Eigenschaft eines TreeView´s ist vom Typ TreeNodeCollection.
Wie es nun am besten ist, Daten von einem Form ins andere zu übertragen ist meiner Meinung nach Geschmackssache, je nach Sicherheit und Performanz der ANwendungsdaten.
Möglichkeit (einfachste, aber irgendwann dich erschlagende):
Du übergibst die ganze TreeNodeCollection per Konstruktorparameter oder Eigenschaft an die Ziel-Klasse (-Form)
Möglichkeit (etwas komplizierter)
Du schreibst ein Interface, das dir bestimmte Methoden bietet, um ganz bestimmte dinge im Parentform (Quellklasse) zu tun, zB eine TreeNodeCollection zurückgeben.
Möglichkeit (angeblich das nonplusultra)
Du schreibst eine eigene Klasse, die sich nur um die Kommunikation zwischen allen anderen Klassen kümmert, und bei der Gelegenheit auch gleich alle Daten abspeichert, sollte sich das Programm schliessen
An alle, entschuldigt meine etwas Laienhaften Ausführungen, ich bin noch Frischling, und habe, wie ich gestehen muß, die anderen Beiträge zur Kommunikation zwischen Forms noch nicht gelesen.
An x-sharp: noch Fragen?
mfG, Pee
mfG, Pee
"Think Shell!"
Danke für die Hilfe
Ich habe das bisher immer mit deiner aufgeführten Möglichkeit 3 gemacht also mit einer
"Kommunikationsklasse" .
Aber bisher ging es immer nur darum Eigenschaftswerte wie textBox.Text oder treeView1.SelectedNode.Index.
wobei mir dort klar war um was für ein Datentyp es sich handelt, textBox.Text ist ein string und treeView1.SelectedNode.Index ist ein int.
Was mir da noch einfiel war ein Array in einer Arraylist der ich dann mit einer Schleife
alle Werte aus den Nodes zuweise. <-- Schrott meiner Meinung nach.
Also um noch mal zum Kern der Frage zu kommen:
wie sieht der Datentyp aus dem ich die Nodes zuweise
TreeNodeCollection tree1 = new TreeNodeCollection();
tree1 = treeView.Nodes; //oder was? wie übergebe ich das einer Funktion?
oder
Form1
object tVmiseCon = treeView1.Nodes;
Form2
treeView1.Nodes = (TreeNodeCollection)tVmiseCon;//explizit?
Uiuiui ganz großes Problem für mich.
Bin euch für jede Hilfe Dankbar
Um was wirklich Neues zu erschaffen muss man das Rad neu erfinden
In der Kommunikationsklasse erstellst du die TreeNodeCollection als (hoffentlich erschlägt mich jetzt keiner) public
public TreeNodeCollection nodes;
Kannst auch ein Property draus machen, damit wir wenigstens Ansatzweise Sicherheitsmechanismen beachten.
Jetzt brauchst du nor mehr vom Quellform die Nodes rausholen (im Endeffekt ziehst du dir dabei aber eine Kopie, damit das auch klar is) und ins andere Form reinübergeben.
Form1
ComClass.nodes = this.TreeView1.nodes;
Form2
this.TreeView2.nodes = ComClass.nodes;
und ferdisch...
P.S. vergiß das "new TreeNodeCollection()", der Konstruktor erwartet einige Argumente, weshalb es nicht so einfach ist eine ganz leere TreeNodeCollection zu instanziieren. In diesem Beispiel brauchst du das aber auch nicht.
mfG, Pee
"Think Shell!"
Herzlichen Dank
Hab ich direkt ausprobiert, scheint vom Prinzip richtig zu sein aber
in dieser Zeile (Form2)
this.treeView1.Nodes = Daten.Daten.nodes;
Debugger:
Property or indexer 'System.Windows.Forms.TreeView.Nodes' cannot be assigned to -- it is read only 8o
read only? warum das jetzt?
Ich kann doch auf Nodes auch schreibend zugreifen, oder?
Um was wirklich Neues zu erschaffen muss man das Rad neu erfinden
Mhm?!? Bin ich jetzt auch etwas ratlos...
Sieht so aus, als würde da doch eine Refernez auf die UrsprungsNodes weitergegeben, und dann ist klar warum readonly ist, weil du kannst nicht ohne weiteres von Form2 auf Form1 direkt zugreifen.
Was spricht eigentlich dagegen in Form2 eine TreeNodeCollection Property zu erstellen, dessen get und set auf TreeView2.Nodes zeigt.
Sag aber gleich dazu, daß ich in dem Gebiet anscheinend doch weniger weiß, als ich ursprünglich glaubte.
Hilfe von dritten wäre jetzt angebracht.
mfG, Pee
"Think Shell!"
Puh mir steht das Try and Error bis zum Hals 😜
Ich habe das jetzt mit einem Array in einer Arraylist gemacht aber das ist echt eine Sch.... Lösung für mich jedenfalls.
Ich hoffe allerdings das mir einer von euch doch noch weiterhelfen kann.
@pee Herzlichen Dank für deine liebe Hilfe
Um was wirklich Neues zu erschaffen muss man das Rad neu erfinden
try this
TreeNode[] nodes = new TreeNode[sourceTreeView.Nodes.Count];
sourceTreeView.Nodes.CopyTo(nodes,0);
targetTreeView.Nodes.Clear();
sourceTreeView.Nodes.Clear();
targetTreeView.Nodes.AddRange(nodes);
So einfach wie möglich, aber nicht einfacher. [Albert Einstein]
take a look at
* baer-torsten.de
* codinghints
Wunderbar!!!
Mit ein wenig ausprobiererei habe ich es hinbekommen 😁
Das mit dem Clear wollte ich einfach nicht wahrhaben aber als ich den sourcetreeview
dann doch noch "gecleart" 8) habe hat es gefunzt.
Vielen Herzlichen Dank für deine Hilfe
Um was wirklich Neues zu erschaffen muss man das Rad neu erfinden
Hier ist eine Klasse, die von TreeView abgeleitet ist. sie lässt die Knoten kopiren und löschen.
using System;
using System.Windows.Forms;
namespace treeview
{
/// <summary>
/// Zusammenfassung für MyTreeView.
/// </summary>
public class MyTreeView: TreeView
{
private string [] path;
public MyTreeView()
{
//
// TODO: Fügen Sie hier die Konstruktorlogik hinzu
//
}
public void addKnot(TreeNode tr)
{
if(tr.FirstNode == null)
{
string[] str = tr.FullPath.Split('\\');
suche(this.Nodes, str, 0);
}
else
{
foreach(TreeNode tmpNode in tr.Nodes)
{
addKnot(tmpNode);
}
}
}
public void suche(TreeNodeCollection node, string[] str, int index)
{
bool flag = true;
if(index >= str.Length)
{
return;
}
foreach(TreeNode pnode in node)
{
if(pnode.Text.Equals(str[index]))
{
suche(pnode.Nodes,str, index + 1);
flag = false;
}
}
if(flag)
{
copy(node,str, index);
}
}
public void copy(TreeNodeCollection node, string[] str, int index)
{
for(int i = index; i < str.Length; i++)
{
TreeNode tmpNode = new TreeNode(str[i]);
node.Add(tmpNode);
node = tmpNode.Nodes;
}
}
public void delete(TreeNode node)
{
if(node != null)
node.Remove();
}
}
}
Usage:
private void button1_Click(object sender, System.EventArgs e)
{
treeView2.addKnot(treeView1.SelectedNode);
}
treeview2 ist als MyTreeView definiert