schrotob Geschrieben 27. Dezember 2011 Geschrieben 27. Dezember 2011 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 Zitieren
mepp Geschrieben 28. Dezember 2011 Geschrieben 28. Dezember 2011 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? Zitieren
schrotob Geschrieben 28. Dezember 2011 Autor Geschrieben 28. Dezember 2011 Das ausgewählte Element der ImageList wird auf allen Ebenen angezeigt und nicht nur auf der gewünschten Ebene. Zitieren
schrotob Geschrieben 29. Dezember 2011 Autor Geschrieben 29. Dezember 2011 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? Zitieren
Klotzkopp Geschrieben 29. Dezember 2011 Geschrieben 29. Dezember 2011 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. Zitieren
mepp Geschrieben 29. Dezember 2011 Geschrieben 29. Dezember 2011 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. Zitieren
schrotob Geschrieben 4. Januar 2012 Autor Geschrieben 4. Januar 2012 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 Zitieren
mepp Geschrieben 4. Januar 2012 Geschrieben 4. Januar 2012 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). Zitieren
HJST1979 Geschrieben 11. Januar 2012 Geschrieben 11. Januar 2012 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 Zitieren
Guybrush Threepwood Geschrieben 11. Januar 2012 Geschrieben 11. Januar 2012 Das ist egal, ob du das Objekt vorher oder nachher in die Liste einfügst. Die Objektreferenz bleibt ja trotzdem die Selbe Zitieren
Empfohlene Beiträge
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.