Treenode-Tag füllen und auslesen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Franz Alberts.

    Treenode-Tag füllen und auslesen

    ausgelagert aus Treenode.tag mit Array beschicken und auslesen ~VaporiZed

    moin zusammen.
    die bis herigen lösungen sind alle gut und funktionierern auch. ich suche aber eine lösung die etwas aussagekräftiger ist. die hatte ich vor längerer zeit mal per zufall bei einer suche nach was anderem gefunden, kann mich aber nicht mehr daran erinnern, nur noch daran das man abfragen und zuweisungen wie folgt tätigen kann:

    xyz = TreeNode.Tag.Pfad
    TreeNode.Tag.Info = abc

    wenn mir jemand helfen kann wie man das realisieren kann würde mir das sehr weiterhelfen
    vielen dank im voraus.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Um einen Cast bei jedem Zugriff wirste nicht herumkommen. Selbst wenn du eine eigene Treenode-Klasse schreibst.
    Du kannst eine Extension-Method schreiben, die die Casts verkapselt.
    Genaueres kann ich dir nicht angeben, weil ich nicht weiss, was du verkapseln willst.
    Die Syntax wird auch bischen anners sein, weil man mit Extensions nur schlecht richtige Properties implementieren kann.
    @ErfinderDesRades Jou.
    @Franz Alberts Die Control.Tag-Property ist vom Typ Object und wenn Du im Designer da was reinschreibst, isses ein String.
    Wenn Du da im Code Deine Instanzen vom Typ rst reinpackst, kannste nicht auf .Pfad oder .Info zugreifen, da .Tag immer noch vom Typ Object ist.
    Du musst die .Tag-Property zuerst zum richtigen Typ casten.
    Falls Du, entgegen unserer dringenden Empfehlung, Strict Off programmierst, wirst Du im Falle eines Crashes keine relevante Hilfe bekommen.
    Visual Studio - Empfohlene Einstellungen
    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!
    erst einmal danke
    zum 2. wie mache ich das?

    RodFromGermany schrieb:

    Du musst die .Tag-Property zuerst zum richtigen Typ casten.


    die angaben control.tag.PFAD und control.tag.INFO sind beide vom type String und betreffen nur nur die einträgen der beiden TreeViewControls.

    und zu guter letzt:
    ich bin ein totaler DAU und hab von tuten und blasen keinerlei ahnung^!^
    Hmm - um irgendetwas hinzukriegen mit Treenodes mit Zusatz-Informationen brauchts aber schon paar Grundlagen:
    • Eine DatenKlasse coden
    • Casten verstehen.
      Vorraussetzung dafür wiederum ist, Datentypen zu unterscheiden, und die Vererbung von Datentypen verstanden haben.
    Und das Treeview-Control ist ja auch nicht einfach, und braucht man auch einiges Verständnis, da TreeNodes einzuhängen, und damit umzugehen.

    Franz Alberts schrieb:

    die angaben control.tag.PFAD und control.tag.INFO sind beide vom type String
    Das ist so nicht gabz korrekt.
    control.tag ist vom Typ Object und Du hast diesem iwas zugewiesen.
    Zwei was zuweisen, was einzeln vom Typ String ist, geht nicht.
    Was ganz genau (den Code bitte) hast Du der .Tag-Property zugewiesen?
    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!
    ' Erstellen eines DirectoryInfo-Objektes, um
    ' die Unterverzeichnisse einzulesen.
    ' Die benötigte Pfadangabe zum Erzeugen des Objekts
    ' ermitteln wir aus der Tag-Eigenschaft des Knotens
    ' (siehe Form1_Load). Wichtig ist, dass der Inhalt
    ' der Tag-Eigenschaft erst mit der Methode CType in
    ' den entsprechenden Typ konvertiert werden muss!!

    Dim VerzeichnisRechts As New IO.DirectoryInfo(CType(Knoten.Tag, String))
    Dim User As String = GetUserName()

    Dim UnterverzeichnisRechts As IO.DirectoryInfo
    Dim DummyverzeichnisRechts As IO.DirectoryInfo

    Dim tn As TreeNode ', xn As TreeNode

    ' Ein Flackern des Treeview soll vermieden werden
    Me.tvOrdnerRechts.BeginUpdate()

    ' Der zuvor erzeugte Dummyknoten wird wieder entfernt,
    ' da dieser beim Einlesen sonst doppelt vorhanden wäre
    Knoten.Nodes.Clear()
    Me.Cursor = Cursors.WaitCursor

    Try
    'loop through the rest of the Folders
    For Each UnterverzeichnisRechts In VerzeichnisRechts.GetDirectories
    If VerzeichnisRechts.Name = "Dokumente und Einstellungen" Then
    If UnterverzeichnisRechts.Name = User Then
    tn = Knoten.Nodes.Add(UnterverzeichnisRechts.Name)
    tn.Tag = UnterverzeichnisRechts.FullName
    tn.ImageIndex = 9
    tn.SelectedImageIndex = 9
    End If
    ElseIf UnterverzeichnisRechts.Name = "$Recycle.Bin" Then
    ElseIf UnterverzeichnisRechts.Name = "OneDriveTemp" Then
    ElseIf UnterverzeichnisRechts.Name = "MSOCache" Then
    ElseIf UnterverzeichnisRechts.Name = "ProgramData" Then
    ElseIf UnterverzeichnisRechts.Name = "Recovery" Then
    ElseIf UnterverzeichnisRechts.Name = "inetpub" Then
    ElseIf UnterverzeichnisRechts.Name = "Users" Then
    ElseIf UnterverzeichnisRechts.Name = "System Volume Information" Then
    ElseIf UnterverzeichnisRechts.Name = "boot" Then

    Else
    tn = Knoten.Nodes.Add(UnterverzeichnisRechts.Name)
    tn.Tag = UnterverzeichnisRechts.FullName
    tn.ImageIndex = 8
    tn.SelectedImageIndex = 1
    End If


    ' Falls das Unterverzeichnis weitere Unterverzeichnisse
    ' besitzt, soll das "+" Zeichen eingeblendet werden
    Try
    tn = Nothing

    For Each DummyverzeichnisRechts In New IO.DirectoryInfo(UnterverzeichnisRechts.FullName).GetDirectories
    ' Hinzufügen eines Dummyknotens
    tn.Nodes.Add(VerzeichnisRechts.Name)
    tn.Tag = VerzeichnisRechts.FullName

    ' Es reicht ein ermitteltes Unterverzeichnis
    ' aus, um das "+" zu erzeugen"
    Exit For
    Next

    Catch
    End Try
    Next
    Catch
    End Try

    Me.tvOrdnerRechts.EndUpdate()
    Me.Cursor = Cursors.Default
    @Franz Alberts Dann pack da ne List(Of String) rein, wo alles drinne steht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim ll = New List(Of String)
    3. ll.Add("aa")
    4. ll.Add("bb")
    5. ll.Add("cc")
    6. TreeView1.Nodes(0).Tag = ll
    7. End Sub
    8. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    9. Dim xx = TryCast(TreeView1.Nodes(0).Tag, List(Of String))
    10. Debugger.Break()
    11. End Sub

    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!
    vielen dank für die konstruktive konversation

    Ich habe es wie Folgt gelöst:

    ...Schnipp

    VB.NET-Quellcode

    1. Dim tnInfo As String = getTnInfo(Verzeichnis) 'ermittelt die informationen zum verzeichnis
    2. tn = Knoten.Nodes.Add(Unterverzeichnis.Name)
    3. tn.Tag = Verzeichnis.FullName
    4. tn.ToolTipText = tnInfo 'schreibt die ermittelten Informationen in den ToolTip des Verzeichniseintrages im TreeView
    5. tn.ImageIndex = 8
    6. tn.SelectedImageIndex = 1
    7. ...Schnipp
    8. ''' <summary>
    9. ''' Ermittelt die Informationen zum Verzeichnis
    10. ''' </summary>
    11. ''' <param name="Knoten"></param>
    12. ''' <returns></returns>
    13. ''' <remarks></remarks>
    14. Private Function getTnInfo(ByVal Knoten As IO.DirectoryInfo) As String
    15. Dim dummy As String = "Erstellt: " & Knoten.CreationTime & vbCrLf
    16. dummy = dummy & "Letzter Zugriff: " & Knoten.LastAccessTime & vbCrLf
    17. dummy = dummy & "Letzter Schreibvorgang: " & Knoten.LastWriteTime & vbCrLf
    18. dummy = dummy & "Name: " & Knoten.Name
    19. Return dummy
    20. End Function
    21. 'Zeige Dateien im ListView an
    22. Sub ShowFileListLinks(ByVal folderspec As String)
    23. Me.lvLinks.Items.Clear()
    24. Try
    25. For Each DummyFilesL In New IO.DirectoryInfo(folderspec).GetFiles
    26. Dim strByts As String = FormatBytes(DummyFilesL.Length, "0.00") 'DummyFilesL.Length
    27. Dim myAttributes As String = DummyFilesL.Attributes
    28. ExtractAssociatedIcon(DummyFilesL.DirectoryName)
    29. [b]Dim lvInfo As String = getLvInfo(DummyFilesL)[/b]
    30. If myAttributes <> 6 Then
    31. lvwAddItem(Me.lvLinks, DummyFilesL.Name, strByts, FormatDateTime(DummyFilesL.LastWriteTime, DateFormat.ShortDate), FormatDateTime(DummyFilesL.LastWriteTime, DateFormat.ShortTime), DummyFilesL.FullName, DummyFilesL.Extension, [b]lvInfo[/b])
    32. Else
    33. End If
    34. Next
    35. Catch ex As ApplicationException
    36. Debug.Print(ex.Message)
    37. Catch ex As AccessViolationException
    38. Debug.Print(ex.Message)
    39. Catch ex As AggregateException
    40. Debug.Print(ex.Message)
    41. Catch ex As IOException
    42. Debug.Print(ex.Message)
    43. Catch ex As System.Exception
    44. Debug.Print(ex.Message)
    45. End Try
    46. End Sub
    47. ''' <summary>
    48. ''' Fügt dem ListView eine komplette Datenzeile hinzu</summary>
    49. ''' <param name="lvw">ListView-Control</param>
    50. ''' <param name="Text">Parameterliste der einzelnen Zellenwerte</param>
    51. '''
    52. Public Sub lvwAddItem(ByVal lvw As ListView, ByVal ParamArray Text() As String)
    53. Dim Suffix As String = Text(Text.Length - 1)
    54. With lvw
    55. Dim lvItem As New ListViewItem
    56. lvItem.ImageKey = Text(4)
    57. lvItem.Text = Text(0)
    58. lvItem.Tag = Text(4)
    59. lvItem.ToolTipText = Text(6)]
    60. lvItem.SubItems.Add(Text(1))
    61. lvItem.SubItems.Add(Text(2))
    62. lvItem.SubItems.Add(Text(3))
    63. lvItem.SubItems.Add(Text(5))
    64. .Items.Add(lvItem)
    65. End With
    66. End Sub


    bitte bei kommenden Posts selber CodeTags verwenden ~VaporiZed

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()