Zum Inhalt springen

TreeView: Darstellung Icons mithilfe einer ImageList


schrotob

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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).

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...