Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo an alle,

ich habe in einem Projekt eine Klasse "TreeView" mit folgendem Quellcode (siehe unten) erstellt. Innerhalb der Klasse wird das Tree-View-Objekt erstellt und anhand eines Dateipfades befüllt. Nun möchte ich für jede Ebene des TreeView mithilfe einer ImageList ein bestimmtes Icon anzeigen lassen. Meine Überlegung war hierbei anhand des jeweiligen Tag der verschiedenen Ebenen ein bestimmtes Icon zu zuweisen.

Beispiel:

If e.Node.Tag = 1 Then

    Me.ImageIndex = 0

    Me.SelectedImageIndex = 0

End If
Leider funktioniert dies nicht gewollt :( Hat jemand von euch eine Idee wie man so etwas realisieren könnte? Vielen Dank schonmal im Voraus. Hier die Klasse "TreeView" zum besseren Verständnis.
Imports System.IO


Public Class TreeView

    Inherits System.Windows.Forms.TreeView

    Friend WithEvents ImageList1 As System.Windows.Forms.ImageList

    Private components As System.ComponentModel.IContainer


    Public Sub New()

        Me.Sort()

        Me.HotTracking = True

        Me.HideSelection = False

    End Sub


    Public Sub ShowTree(ByVal Path As String)

        Me.Nodes.Clear()

        Dim nNode As New TreeNode(Path)

        nNode.Tag = 1

        Me.Nodes.Add(nNode)

        Me.FillTreeNode(nNode)

        Me.Nodes.Item(0).Expand()

    End Sub


    Public Sub FillTreeNode(ByVal dNode As TreeNode)

        Try

            Dim d As New DirectoryInfo(dNode.FullPath)

            For Each di As DirectoryInfo In d.GetDirectories

                Dim nNode As New TreeNode(di.Name)

                dNode.Nodes.Add(nNode)

                nNode.Tag = Convert.ToInt32(dNode.Tag) + 1

                nNode.Nodes.Add("")

            Next

        Catch ex As Exception

            MsgBox(ex.Message)

        End Try

    End Sub


    Protected Overrides Sub OnBeforeExpand(ByVal e As System.Windows.Forms.TreeViewCancelEventArgs)

        Dim n As TreeNode = CType(e.Node, TreeNode)

        If n.Nodes(0).Text = "" Then

            Me.BeginUpdate()

            n.Nodes.Clear()

            Me.FillTreeNode(n)

            Me.EndUpdate()

        End If

        MyBase.OnBeforeExpand(e)

    End Sub


    Private Sub InitializeComponent()

        Me.components = New System.ComponentModel.Container()

        Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(TreeView))

        Me.ImageList1 = New System.Windows.Forms.ImageList(Me.components)

        Me.SuspendLayout()

        '

        'ImageList1

        '

        Me.ImageList1.ImageStream = CType(resources.GetObject("ImageList1.ImageStream"), System.Windows.Forms.ImageListStreamer)

        Me.ImageList1.TransparentColor = System.Drawing.Color.Transparent

        Me.ImageList1.Images.SetKeyName(0, "oem.png")

        Me.ImageList1.Images.SetKeyName(1, "car.png")

        Me.ImageList1.Images.SetKeyName(2, "project.png")

        Me.ImageList1.Images.SetKeyName(3, "folder.ico")

        '

        'TreeView

        '

        Me.LineColor = System.Drawing.Color.Black

        Me.ResumeLayout(False)


    End Sub

End Class

Was funktioniert denn genau nicht, wie gewünscht? Ich kann mir vorstellen, dass dir nur höchstens 2 unterschiedliche Icons angezeigt werden.

Oder werden die Icons garnicht richtig geladen?

Das ausgewählte Element der ImageList wird auf allen Ebenen angezeigt und nicht nur auf der gewünschten Ebene.

Habe jetzt nochmal eine ForEach-Schleife herumgelegt. Allerdings tritt das gleiche Problem auf. Das Icon der ersten Ebene wird quasi an alle anderen Ebenen "vererbt"

Me.ImageList = frmMain.ImageList1


            For Each nNode In Nodes

                If nNode.Tag = 1 Then

                    ImageIndex = 0

                ElseIf nNode.Tag = 2 Then

                    ImageIndex = 1

                ElseIf nNode.Tag = 3 Then

                    ImageIndex = 2

                Else

                    ImageIndex = 3

                End If

            Next

Kennt niemand eine Möglichkeit den einzelnen Ebenen eines TreeView verschiedene Icons zu zuweisen?

Habe jetzt nochmal eine ForEach-Schleife herumgelegt.
Was genau ist denn ImageIndex in diesem Fragment? Hast du da selbst eine Variable angelegt?

Kennt niemand eine Möglichkeit den einzelnen Ebenen eines TreeView verschiedene Icons zu zuweisen?
Du musst jedem Knoten sein Icon zuweisen.

Ja das TreeView erhält eine ImageList.

Dann kannst du bei allen Nodes node.ImageIndex = node.Tag machen.

Wobei du dann auch das befüllen der Tags sein lassen kannst und den ImageIndex der Nodes direkt setzen (anstatt des Tags).

Ich glaube da liegt dein Problem. Dass du den ImageIndex des Treeviews änderst anstatt den der Nodes.

Beim ändern des TreeView.ImageIndex veränderst du den Standardwert für den ImageIndex der Nodes. Damit verbunden auch das Bild.

Was genau ist denn ImageIndex in diesem Fragment? Hast du da selbst eine Variable angelegt?

Du musst jedem Knoten sein Icon zuweisen.

ImageIndex ist eine Eigenschaft des TreeView. Es gibt den Standardbildwert für die Knoten an. Und genau hier lag das Problem. Ich habe immer den ImageIndex des TreeView angesprochen und nicht der einzelnen Knoten. Wenn man den ImageIndex der einzelnen Knoten anspricht funktioniert es einwandfrei:

Sub SetImage(ByVal nNode As TreeNode)

        Me.ImageList = frmMain.ImageList1


        If nNode.Tag = 1 Then

            nNode.ImageIndex = 0

            nNode.SelectedImageIndex = 0

        ElseIf nNode.Tag = 2 Then

            nNode.ImageIndex = 1

            nNode.SelectedImageIndex = 1

        ElseIf nNode.Tag = 3 Then

            nNode.ImageIndex = 2

            nNode.SelectedImageIndex = 2

        Else

            nNode.ImageIndex = 3

            nNode.SelectedImageIndex = 3

        End If

    End Sub

Vielen Dank für Eure Hilfe :)

So würde mir das noch viel besser gefallen:


Sub SetImage(ByVal nNode As TreeNode)

        nNode.ImageIndex = IIF(nNode.Tag <= 3 , Math.Max(0, nNode.Tag-1) , 3)

        nNode.SelectedImageIndex = nNode.ImageIndex

End Sub

Me.ImageList = frmMain.ImageList1

Kannst du glaube ich weglassen, weil es immer die selbe imageList ist (die vom Form).

Hallo ich denke du hast einen Fehler im Code


            Dim d As New DirectoryInfo(dNode.FullPath)

            For Each di As DirectoryInfo In d.GetDirectories

                Dim nNode As New TreeNode(di.Name)

                dNode.Nodes.Add(nNode)

                nNode.Tag = Convert.ToInt32(dNode.Tag) + 1

                nNode.Nodes.Add("")

            Next

Du setzt den nNode.Tag NACHDEM du dieses Node an dNode angehängt hast, dies kann m.E. nicht funktionieren, denn wenn du dann alle Nodes durchläuft ist genau dieses Node NICHT im Treeview. Ich würds so machen

            Dim d As New DirectoryInfo(dNode.FullPath)

            For Each di As DirectoryInfo In d.GetDirectories

                Dim nNode As New TreeNode(di.Name)

                nNode.Tag = Convert.ToInt32(dNode.Tag) + 1

                nNode.Nodes.Add("")


                If nNode.Tag = 1 Then

                  nNode.ImageIndex = 0

                  nNode.SelectedImageIndex = 0

                ElseIf nNode.Tag = 2 Then

                  nNode.ImageIndex = 1

                  nNode.SelectedImageIndex = 1

                ElseIf nNode.Tag = 3 Then

                  nNode.ImageIndex = 2

                  nNode.SelectedImageIndex = 2

                Else

                  nNode.ImageIndex = 3

                  nNode.SelectedImageIndex = 3

                End If

                dNode.Nodes.Add(nNode)


            Next

Gruß Hans-Jörg

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.