schrotob Geschrieben 27. Dezember 2011 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mepp Geschrieben 28. Dezember 2011 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schrotob Geschrieben 28. Dezember 2011 Autor Teilen Geschrieben 28. Dezember 2011 Das ausgewählte Element der ImageList wird auf allen Ebenen angezeigt und nicht nur auf der gewünschten Ebene. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schrotob Geschrieben 29. Dezember 2011 Autor Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Dezember 2011 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mepp Geschrieben 29. Dezember 2011 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schrotob Geschrieben 4. Januar 2012 Autor Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mepp Geschrieben 4. Januar 2012 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HJST1979 Geschrieben 11. Januar 2012 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 11. Januar 2012 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.