Treenode.tag mit Array beschicken und auslesen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von drschef.

    Treenode.tag mit Array beschicken und auslesen

    Die Nodes eines Treeview controls sollen mit einem Array beschickt werden:

    Visual Basic-Quellcode

    1. With TV.Nodes.Add(name)
    2. '...
    3. .Tag = {"ABC", "DEF"}
    4. '....
    5. End With


    Das scheint zu klappen. Das Problem beginnt beim Auslesen. Ich habe schon eine Weile experimentiert und recherchiert. Aber irgenwie gibt es immer Probleme mit der Unverträglichkeit der Typen. Im einfachsten Fall bringt die folgende Notation viele Fehler

    Visual Basic-Quellcode

    1. Private OldTag(2) As String
    2. OldTag= NodeAlt.tag
    3. NodeNeu.Tag = OldTag
    4. 'oder ...
    5. NodeNeu.Tag(0) = OldTag(0)
    6. NodeNeu.Tag(1) = OldTag(1)

    Auch Ctype ... Object oder Verwendung einer Structure haben bisher nichts gebracht. Wie könnte das

    Array => Tag => Array bzw.
    Tag => Array => Tag

    gelingen?
    Moin,

    so mach ich das:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim tmpString() As String = {"test1", "test2"}
    3. TreeView1.Nodes(0).Tag = tmpString 'Speichern
    4. End Sub
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Dim getBackString() As String = DirectCast(TreeView1.Nodes(0).Tag, String()) 'Laden
    7. For Each test As String In getBackString
    8. Console.WriteLine(test)
    9. Next
    10. End Sub


    Du kannst eigentlich fast alles an Objekten dort rein hauen. Du musst nur wenn du es wieder ausliest auch von Object (so ist es drin gespeichert) in dein Typen Casten.
    In meinem Fall String().
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @drschef Mach Dir ne Klasse MyTagClass, die den Inhalt dieses Tags besachreibt.
    Schreiben:
    Erstell ne Instanz der Klasse mit den entsprechenden Werten.
    Weise dem Tag diese Instanz zu.
    Lesen:
    Caste den Tag zu Deiner Klasse

    VB.NET-Quellcode

    1. Dim myTag = CType(xxx.Tag, MyTagClass)
    Verwende myTag.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @xChRoNiKx Ich denke, das ist egal.
    Analog zu C#:

    C#-Quellcode

    1. MyTagClass myTag = xxx.Tag as MyTagClass
    2. // oder
    3. MyTagClass myTag = (MyTagClass)xxx.Tag
    Bei Nicht-Cast kommt beim oberen null raus, beim unteren kommt eine InvalidCastException.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,

    habe die Diskussion verfolgt. Ich hatte selbst anfangs die folgende Lösung realisiert:

    VB.NET-Quellcode

    1. With TV.Nodes.Add(name)
    2. '...
    3. .Tag = Part1 + ";" + Part2
    4. '....
    5. End With


    Auslesen etwa mit

    VB.NET-Quellcode

    1. Dim TAG() As String = dirNode.Tag.ToString.Split(CChar(";"))
    2. P1 = TAG(0)
    3. P2 = TAG(1)​


    Scheinbar sind die 3 Varianten fast gleichwertig, was den Schreib- und Leseaufwand betrifft. Bei verschiedenen Formaten im Tag-Inhalt könnte meine etwas ungünstiger sein.
    Dazu nur ganz kurz:
    statt dirNode.Tag.ToString.Split(CChar(";")) kannst Du ";" auch als Char "markieren": dirNode.Tag.ToString.Split(";"c)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.