TreeView + XML --> Zusatz soll noch gestartet werden und Icons einfügen??

  • VB.NET

Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    zum Xml ist zu sagen, dass das Icon-Attribut (es ist kein "Parameter"!) mal den kompletten Dateipfad angibt, mal nur einen Dateinamen.
    So kann man den Mischmasch nicht auswerten.
    Es ist erforderlich, dass in der Xml dieselben Icon-Bezeichnungen stehen, welche an anderer Stelle als Key verwendet werden bei der Befüllung der ImageList.

    Derzeit gibst du bei der Befüllung leider für alle Icons denselben Key an- "*.*" -wundert mich, dass das keine Exception wirft, aber wie dem auch sei, wird man mit so einer Imagelist auch nix anfangen können, weil man die Icons darin nicht mehr unterscheiden kann.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Der Code von XmlTreeView_Load ist aktuell folgender :

    VB.NET-Quellcode

    1. Private Sub XmlTreeView_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Controls.AddRange(New Control() {TreeView1})
    3. Me.TreeView1.Nodes.Clear()
    4. 'Dim di As New System.IO.DirectoryInfo(Application.StartupPath & "\Icons")
    5. 'If (di.Exists) Then
    6. 'For Each fi As System.IO.FileInfo In di.GetFiles()
    7. 'ImageList1.Images.Add("*.*", Icon)
    8. 'Next
    9. 'End If
    10. XmlTreeView.LoadFromXml("nodes.xml", Me.TreeView1)
    11. End Sub

    Den "ausgeklammerten" Bereich hatte ich getestet, ob ich so hinbekommen. Mit "*.*" hatte ich die Hoffnung, dass ich so alle .ico-Dateien aus meinem Ordner einfach in die Imagelist eintragen kann. Leider falsch gehofft.

    @ ErfinderDesRades : ich hab es schon versucht, durch Angabe des kompletten Pfades von allen .ico-Dateien in der XML bzw. habe ich es auch schon versucht die .ico-Dateien alle in den Pfad des Programmes/XML zu legen und nur die Dateinamen der .ico´s anzugeben. Es hat alles nichts genützt.
    @zauber777 Lesen können ist von Vorteil.
    Nein: XmlTreeView_Load(...).
    Ja: XmlTreeView.LoadFromXml(...) <= Den Code dieser Prozedur möchte ich seit Post #15 sehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @zauber777 Was ganz genau ist XmlTreeView für eine Instanz?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ok, ich glaube, ich weiss was du meinst :

    VB.NET-Quellcode

    1. ​Option Explicit On
    2. Option Strict On
    3. Imports System
    4. Imports System.Net
    5. Imports System.Net.Sockets
    6. Imports System.Runtime.InteropServices
    7. Imports System.Net.NetworkInformation
    8. Imports System.IO
    9. Imports System.Text
    10. Imports System.Diagnostics
    11. Imports System.ComponentModel
    12. Imports System.Drawing
    13. Imports System.Management
    14. Imports Microsoft.Win32
    15. Imports System.Threading
    16. Imports System.Xml
    17. Imports System.Collections.Generic
    18. Imports System.Windows.Forms
    19. Public Class XmlTreeView
    20. Public Class MyTreeNode
    21. Inherits TreeNode
    22. Public Property Path As String
    23. End Class
    24. Public Shared Sub LoadFromXml(ByVal FileName As String, ByVal TheTreeView As TreeView)
    25. Dim xDoc As New XmlDocument
    26. xDoc.Load(FileName)
    27. FillTreeView(TheTreeView.Nodes, xDoc.DocumentElement)
    28. End Sub
    29. Private Shared Sub FillTreeView(ByVal CurrentNodes As TreeNodeCollection, ByVal xNode As XmlNode)
    30. For Each xChild As XmlNode In xNode.ChildNodes
    31. If xChild.Name <> "Programm" Then
    32. FillTreeView(CurrentNodes.Add(xChild.Name).Nodes, xChild)
    33. Else
    34. CurrentNodes.Add(New MyTreeNode With {.Text = xChild.InnerText, .Path = xChild.Attributes("Path").Value})
    35. End If
    36. Next
    37. End Sub
    @zauber777 Genau das.
    Da musst Du das Icon-Handling halt implementieren.
    Das sind zwei Teile.
    Einmal musst Du eine ImageList mit den entsprechenden Bildern in der richtigen Reihenfolge befüllen und diese ImageList dem TreeView zuweisen,
    dann musst Du beim Auslesen der Nodes die Image-Indizes setzen.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    je nach Reihenfolge
    Jou. Da müssten wir mal ein wenig XML-Inhalt und VB-Code sehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hatte diese Woche leider es nicht geschafft zu antworten.
    Bisher ist mein Code nur der Code für die XML-TreeView-"Geschichte". Natürlich soll das Programm noch mehr können, aber das werde ich alles erst später programmieren, wenn mein größtes Sorgenkind (XML/Icon/TreeView) funktioniert.
    In meiner Form ist nur der XMLTreeView und eine ImageList, welche ich in den Eigenschaften dem XMLTreeView zugeordnet habe.

    Mein kompletter Code sieht wie folgt aus :

    VB.NET-Quellcode

    1. ​Option Explicit On
    2. Option Strict On
    3. Imports System
    4. Imports System.Net
    5. Imports System.Net.Sockets
    6. Imports System.Runtime.InteropServices
    7. Imports System.Net.NetworkInformation
    8. Imports System.IO
    9. Imports System.Text
    10. Imports System.Diagnostics
    11. Imports System.ComponentModel
    12. Imports System.Drawing
    13. Imports System.Management
    14. Imports Microsoft.Win32
    15. Imports System.Threading
    16. Imports System.Xml
    17. Imports System.Collections.Generic
    18. Imports System.Windows.Forms
    19. Public Class XmlTreeView
    20. Public Class MyTreeNode
    21. Inherits TreeNode
    22. Public Property Path As String
    23. End Class
    24. Public Shared Sub LoadFromXml(ByVal FileName As String, ByVal TheTreeView As TreeView)
    25. Dim xDoc As New XmlDocument
    26. xDoc.Load(FileName)
    27. FillTreeView(TheTreeView.Nodes, xDoc.DocumentElement)
    28. End Sub
    29. Private Shared Sub FillTreeView(ByVal CurrentNodes As TreeNodeCollection, ByVal xNode As XmlNode)
    30. For Each xChild As XmlNode In xNode.ChildNodes
    31. If xChild.Name <> "Programm" Then
    32. FillTreeView(CurrentNodes.Add(xChild.Name).Nodes, xChild)
    33. Else
    34. CurrentNodes.Add(New MyTreeNode With {.Text = xChild.InnerText, .Path = xChild.Attributes("Path").Value})
    35. End If
    36. Next
    37. End Sub
    38. Sub treeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
    39. Try
    40. Dim path = TryCast(TreeView1.SelectedNode, MyTreeNode).Path
    41. If path IsNot Nothing Then Process.Start(path)
    42. Catch ex As Exception
    43. MsgBox("kein Programm gefunden")
    44. End Try
    45. Select Case e.Node.Text
    46. Case "Visual Studio"
    47. MsgBox("Visual Studio")
    48. '...
    49. Case "Excel"
    50. MsgBox("Excel")
    51. '...
    52. End Select
    53. End Sub
    54. Private Sub XmlTreeView_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    55. Controls.AddRange(New Control() {TreeView1})
    56. Me.TreeView1.Nodes.Clear()
    57. XmlTreeView.LoadFromXml("nodes - kopie.xml", Me.TreeView1)
    58. 'TreeView1.Nodes(0).Expand()
    59. End Sub
    60. End Class


    Meine XML sieht wie folgt aus :

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <Nodes>
    3. <Node Text="Programme" Icon="Program_Folder.ico">
    4. <Node Text="Programm-Gruppe 1" Icon="ProgGruppe1.ico">
    5. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe" Icon="VS.ico">Visual Studio</Programm>
    6. <Programm Path="C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" Icon="Excel.ico">Excel</Programm>
    7. </Node>
    8. <Node Text="andere" Icon="andereProg.ico">
    9. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE" Icon="VB.ico">VB.NET</Programm>
    10. </Node>
    11. <Node Text="Programm-Gruppe 2" Icon="ProgGruppe2.png">
    12. <Programm>kommtnoch1</Programm>
    13. <Programm>kommtnoch2</Programm>
    14. </Node>
    15. </Node>
    16. </Nodes>


    Ich hoffe ihr könnt mir, mit dem Code weiterhin helfen.

    zauber777 schrieb:

    Ich hoffe ihr könnt mir, mit dem Code weiterhin helfen.
    Was für Probleme hast Du damit?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @zauber777 OK, war mir entfallen.
    Ich werd mir das morgen mal ansehen.
    Wo liegen die Icons?
    Ressource oder Festplatte?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @zauber777 Deine Benenung hat mich etwas wuschig gemacht.
    XmlTreeView ist eine Form, dann benenne sie auch Form.
    Schöne Namen geben kannst Du Deinen Klassen, wenn das Programm läuft. Wenn Du Hilfe aus dem Forum erwartest, ist es besser, dass die Formen Form1, Form2, ... heißen und die Buttons Button1, Button2 usw., wie der Designer sie anlegt.
    Da lässt sich von uns schnell eine kleine Test-GUI erstellen, ohne dass alle Controls umbenannt werden müssen. Allerdings ist der @ErfinderDesRades da anderer Meinung.
    ================
    Beim Einlesen Deiner XML knallt es bei kommtnoch1|2, weil da der Pfad fehlt, hab ich mal rausgenommen.
    Deine Fragestellung zum Icon wundert mich allerdings sehr, denn in Deinem Quelltext kommt die Buchstabenfolge "Icon" nicht vor.
    Du liest kein Icon ein, also kann auch kein Icon angezeigt werden.
    =====
    Um zu erfahren, wie Icons zu TreeNodes hinzugefügt werden, verweise ich Dich auf die entsprechenden Posts in diesem Deinen Thread.
    Lies sie, verstehe sie und setze sie um.
    Wenn dann was nicht funktionieren sollte, melde Dich wieder.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Genau hier liegt das Problem... Im Post Nr 12, schreibst du dass ich es dynamisch hinzufügen soll.
    Leider verstehe ich es absolut nicht

    Meine Idee war es im Sub "FillTreeView" folgendes einzufügen.

    VB.NET-Quellcode

    1. For Each xChild As XmlNode In xNode.ChildNodes
    2. If xChild.Name <> "Icon" Then
    3. FillTreeView(CurrentNodes.Add(xChild.Icon).Nodes, xChild)
    4. Else
    5. End If
    6. Next

    Jedoch kennt VB nicht Icon als Bild. Dies ist wahrscheinlich einfach zu tief in der Materie, als das ich es verstehen könnte mit meinem einfachen Grundkenntnissen ;.-(

    zauber777 schrieb:

    Jedoch kennt VB nicht Icon als Bild
    Pack die Icons in die essourcen des Projekts.
    Erstell eine ImageList per Designer.
    Befülle die ImagerList aus den Ressources.
    Benenn die Namen der Icons in der XML in "Img1", "Img2" usw. um.
    Gib Deined Klasse MyTreeNode einen Konstruktor, der Indizes versteht und weiterreicht.
    Weiter in meinen benannten Posts.
    Raus kommt dies:

    Aber etwas solltest Du auch allein machen...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Pack die Icons in die essourcen des Projekts.Erstell eine ImageList per Designer.Befülle die ImagerList aus den Ressources.Benenn die Namen der Icons in der XML in "Img1", "Img2" usw. um.Gib Deined Klasse MyTreeNode einen Konstruktor, der Indizes versteht und weiterreicht.Weiter in meinen benannten Posts.


    Ich scheitere schon im ersten Schritt, die Icons per Code bei Programmstart in die Ressources zu laden. Dies kann soweit ich schon gelesen habe nicht funktionieren, da die Ressources wohl "Read-Only" im Betrieb nur sind.


    Ich werde wohl das Handtuch werfen müssen und es aufgeben. Im Netz habe ich auch keine Codeschnippsel oder ähnliches gefunden, was irgendwie mit meinem Problem in Verbindung stehen könnte.
    Danke @RodFromGermany aber auch dein "TestTreeView" ist mir da leider keine Hilfe, da hier auch keine Icons separat während der Laufzeit aus dem Pfad eingelesen werden, sondern von dir manuell in die Ressourcen fest eingelesen.
    Vielen Dank euch für eure Versuche mir zu helfen...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „zauber777“ ()

    zauber777 schrieb:

    die Icons per Code bei Programmstart in die Ressources zu laden.
    OMG. ;(
    Gugst Du hier.
    ====
    Zerlege Dein Projekt in eine Reihe disjunkter Teilprobleme und löse sie jedes einzeln in einem separaten Projekt.
    Wenn alle Deine Teilprobleme zu Deiner Zufriedenheit gelöst sind, füge die Teile in einem neuen Projekt zusammen.
    Fang an mit einer vollständigen und belastbaren Problembeschreibung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    OMG.
    Gugst Du hier.


    Klar kenne ich diese Version die Dateien in die Resourcen zulegen!
    Dies ist jedoch NICHT, das was ich will!!!!!!

    Wenn ich mein Programm starte, wird die XML eingelesen, zusätzlich werden erst dann die Icon´s eingelesen! Die Knoten/Nodes im Treeview sollen immer wieder erweiterbar sein und dies nur durch verändern der XML!
    Sollte ich jedes Mal das Programm selbst neu kompilieren müssen, weil ich umständlich erst die neuen Icons in die Ressourcen hinzufügen muss, dann könnte ich auch gleich die XML-Geschichte weg lassen und direkt jedes Mal über die Eigenschaften des TreeViews die neuen Knoten hinzufügen und gleich die Icons zuordnen.

    Ich hatte die Hoffnung, dass ich den Programmcode nur einmal schreiben muss und dann nur noch die XML ändern muss, wenn neue Knoten (auch mit anderen Icons) dazu kommen!?!