Hi!
Wie kann ich mir das was ich bei TreeNode.Tag eingetragen habe wieder auslesen?
Vor allem wenn da unterschiedliche Klassen hinterlegt sind? Also nicht alle Nodetags sind gleich.
Dankö
mayclass c = mynode.Tag as mayclass;
if(c != null) { mayclass.DoSomethingAwesome();}
edit: siehe auhc: [Tipp] Casten aber richtig: Begriffe wie Cast / is / as
Hallo FeelFlow,
TreeNode.Tag
hat den Datentyp object
, von daher müssen die hinterlegten Objekte erst in die entsprechenden Klassen gecastet werden.
MyClass myClass = TreeNode.Tag as MyClass;
if (myClass != null)
{
// Cast war erfolgreich, TreeNode.Tag war vom Datentyp MyClass (oder ein Derivat davon)
/* Code ... */
}
Siehe auch [Tipp] Casten aber richtig: Begriffe wie Cast / is / as.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Ich weiß aber nicht, was im Tag is... es kann sein, dass in myClass casten muss aber es kann auch vorkommen, dass es in yourClass kommt.
Hallo FeelFlow,
das ist natürlich der Nachteil an object
. Wenn es eine feste, kleine Anzahl an möglichen Klasse ist, kannst du natürlich den obigen Codeblock mehrfach verwenden und auf mehrere Typen prüfen.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Also ich hab mal was probiert...
myClass a = treeView.SelectedNode.Tag as myClass;
yourClass b = treeView.SelectedNode.Tag as yourClass;
if (a != null)
{
//mach was
}
if (b != null)
{
//mach was anderes
}
Wenn das Object nicht in myClass passt, dann bleibt a = null
Find ich aber nicht sonderlich elegant, weil ich das ganze auch 7 mal machen muss.
Hallo FeelFlow,
wie JAck30lena schon gesagt hat, ist das ganze eine Design-Frage und derzeit nicht elegant gelöst. Hast du keine Möglichkeit, eine gemeinsame Basisklasse oder ein implementiertes Interface zu verwenden und nach diesem zu casten?
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Eine Basisklasse über alle Klassen zu ziehen - hat ja m0rius bereits erwähnt - ist wohl die eleganteste Lösung.
Sollten es dennoch komplett unterschiedliche Klassen sein, obwohl das Design dann irgendwie verquer ist, könnte man über TreeNode eine generische Extension Method legen, die einen den passenden Typ aus dem Tag ermittelt. Das würde dann die Tipparbeit drastisch vermindern. Der eigentliche Problem ist dann natürlich das gleiche.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
hmm... ich werde aber wohl nicht drumrum kommen, jeden klick einzeln auszuwerten, was da eigentlich geklickt wurde.
Hallo FeelFlow,
momentan weißt du lediglich, dass in TreeNode.Tag
beliebige Objekte abgelegt sind, die aber allesamt - wie jedes Objekt in .NET - von object
ableiten. Wenn du die gemeinsame Basisklasse konkretisieren kannst, also beispielsweise weißt, dass TreeNode.Tag
ein IEnumerable<string>
enthält, kann es dir ja egal sein, ob dort nun ein String-Array string[]
enthalten ist oder eine List<string>
. Deshalb kannst du nach IEnumerable<string>
casten und mit dieser Abstraktion weiterarbeiten.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Hallo FeelFlow,
Könnt ihr mir das mit der basisklasse genauer erklären?
bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
Polymorphie (und darum geht es ja) setzen wir als bekannt voraus.
herbivore