Veröffentlicht 27. Dezember 201113 j 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
28. Dezember 201113 j 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?
28. Dezember 201113 j Das ausgewählte Element der ImageList wird auf allen Ebenen angezeigt und nicht nur auf der gewünschten Ebene.
29. Dezember 201113 j 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?
29. Dezember 201113 j 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.
29. Dezember 201113 j 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.
4. Januar 201213 j 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
4. Januar 201213 j 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).
11. Januar 201213 j 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
11. Januar 201213 j Das ist egal, ob du das Objekt vorher oder nachher in die Liste einfügst. Die Objektreferenz bleibt ja trotzdem die Selbe
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.