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.

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

    Ich kämpfe leider noch immer mit meinem TreeView im Zusammenhang mit XML... Hier stehe ich vor 2 Problemen.
    1. wie kann ich via meiner XML jeden Node ein eigenes Icon zuweisen?

    2. wie kann ich aus einen Node in der XML mit einem Case oder ähnliches verknüpfen und "Zusätze" beim Doppelklick zu starten.

    Hier mein Lösungsansatz leider wird der Code bei "Case" ignoriert...:

    mein XML

    XML-Quellcode

    1. ​<?xml version="1.0" encoding="utf-8" ?>
    2. <Nodes>
    3. <Programme>
    4. <Test>
    5. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe">Visual Studio</Programm>
    6. <Programm Path="C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE">Excel</Programm>
    7. </Test>
    8. <andere>
    9. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE">VB.NET</Programm>
    10. </andere>
    11. </Programme>
    12. <Test1>
    13. <Programm>bla</Programm>
    14. <Programm>blup</Programm>
    15. </Test1>
    16. </Nodes>


    mein Programmcode für den Doppelklick :

    VB.NET-Quellcode

    1. ​Sub treeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
    2. Select Case TreeView1.SelectedNode.Name
    3. Case "Visual Studio"
    4. MsgBox("Visual Studio")
    5. '...
    6. Case "Excel"
    7. Label4.Text = "Excel wurde gestartet"
    8. '...
    9. End Select
    10. End Sub



    Ich hoffe ihr könnt mir weiterhelfen
    Nachwievor ist das Hauptproblem, dass du in deim Xml Auszeichnung und DatenInhalte vermischst. Zwar nurnoch teilweise - etwa bei die Programme machst du es richtig, dass jedes Programm gleich ausgezeichnet wird (nämlich als <Programm>), und Pfad und ProgName sind Daten.
    Aber die anneren Nodes, die du bilden wirst, sind noch immer alle unterschiedlich getaggt - obwohl alle dasselbe darstellen sollen, nämlich Treenodes.
    Ein ordentlicheres Xml könnte etwa so aussehen:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <Nodes>
    3. <Node Text="Programme">
    4. <Node Text="Test">
    5. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe">Visual Studio</Programm>
    6. <Programm Path="C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE">Excel</Programm>
    7. </Node>
    8. <Node Text="andere">
    9. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE">VB.NET</Programm>
    10. </Node>
    11. <Node Text="Test1">
    12. <Programm>bla</Programm>
    13. <Programm>blup</Programm>
    14. </Node>
    15. </Node>
    16. </Nodes>
    Zur Frage mitte Icons besteht Konzeptions-Bedarf: Soll jeder einzelne Node ein eigenes Icon bekommen, oder gibt es Gruppen von Nodes, denen derselbe Icon zuzuteilen ist?
    Letzteres ist gewöhnlich der Sinn von Icons (und auch wirtschaftlicher), aber dafür müsste man im Xml entsprechende Gruppen-Tags einführen.



    Ach - zu deim "nicht angesprungen" - Problem: die Cases, die du selecten willst, stehen wohl nicht in Treenode.Name, sondern in Treenode.Text.
    .Name ist eine ganz bescheuerte Treenode-Property, die ganz generell eiglich nur Verwirrung stiftet.
    Also konkret probierma:

    VB.NET-Quellcode

    1. Sub treeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
    2. Select Case e.Node.Text
    3. Case "Visual Studio"
    4. MsgBox("Visual Studio")
    5. '...
    6. Case "Excel"
    7. Label4.Text = "Excel wurde gestartet"
    8. '...
    9. End Select
    10. End Sub

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

    zauber777 schrieb:

    wie kann ich via meiner XML jeden Node ein eigenes Icon zuweisen?
    Ein Icon kannst Du über eine ImageList zuweisen.
    Pack alle relevanten Icons in eine ImageList. Weise dem TreeView diese ImageList als ImageList-Property zu.
    Gib jedem Iten den betrefenden ImageList-Index.
    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!
    Danke @ErfinderDesRades

    Nun ist jedoch das 2. Problem noch mit den Icon´s...
    Ja, es soll jeder einzelne Node ein eigenes Icon bekommen.nullDie Version von RoadFromGermany kenne ich nur so, dass ich über die Eigenschaften vom TreeView es direkt zuordne. Dies sollte aber meiner Meinung nach nur funktionieren, wenn ich auch direkt über die Eigenschaften die Nodes anlege!?!

    Ich dachte eigentlich, dass ich die einzelnen Icon´s in einen eigenen Ordner lege und dann in der XML die Icon´s zuordne!?
    Ja, etwa so:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <Nodes>
    3. <Node Text="Programme" Icon="BlaBlub.ico">
    4. <Node Text="Test" Icon="icon2.ico">
    5. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe">Visual Studio</Programm>
    6. <Programm Path="C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE">Excel</Programm>
    7. </Node>
    8. <Node Text="andere" Icon="23.ico">
    9. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE">VB.NET</Programm>
    10. </Node>
    11. <Node Text="Test1" Icon="Huhu.ico">
    12. <Programm>bla</Programm>
    13. <Programm>blup</Programm>
    14. </Node>
    15. </Node>
    16. </Nodes>
    So kennt jeder Node seinen Icon-Namen - der zugehörige Pfad (ist ja für alle der gleiche) sollte im Programm bekannt sein.

    zauber777 schrieb:

    Ich dachte eigentlich
    dass ich den den Tipp von RodFromGermany ignorieren kann, weil ich geglaubt habe, dass allein das Vorhandensein irgend eines Icon-Eintrags in der XML-Datei ausreicht, die TreeView-Anzeige mit einem Icon zu bestücken.
    @zauber777 Nein, hier irrst Du, der TreeView weiß nix von Deiner XML-Datei, geschweige denn vom Verzeichnis, wo Deine Icons liegen.
    Du musst alle Icons fein säuberlich in eine ImageList packen, diese dann dem TreeView als Property zuweisen und sie dann per Index den TreeView-Nodes einzeln zuweisen.

    Objektbrowser schrieb:

    Public Sub New(text As String, imageIndex As Integer, selectedImageIndex As Integer)
    Member von System.Windows.Forms.TreeNode
    Zusammenfassung:
    Initialisiert eine neue Instanz der System.Windows.Forms.TreeNode-Klasse mit dem angegebenen Bezeichnungstext sowie den angegebenen Bildern, die den ausgewählten bzw. den nicht ausgewählten Zustand des Strukturknotens anzeigen sollen.
    Parameter:
    text: Der System.Windows.Forms.TreeNode.Text der Bezeichnung des neuen Strukturknotens.
    imageIndex: Der Indexwert des System.Drawing.Image, das angezeigt wird, wenn der Strukturknoten nicht ausgewählt ist.
    selectedImageIndex: Der Indexwert des System.Drawing.Image, das angezeigt wird, wenn der Strukturknoten ausgewählt ist.

    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!
    Leider nimmt er das Icon nicht. Selbst wenn ich den kompletten Pfad angebe zum Icon.
    Am Icon selbst liegt es aber nicht, da ich das Icon auch schon per Index über die Eigenschaften vom TreeView getestet habe.

    Habe gerade festgestellt, dass der TreeView zumindest versucht das Icon zu laden, denn vor dem Namen der Nodes ist ein weißer Platzhalter. Das heisst das Icon wird nicht richtig dargestellt.

    Den einzelnen Programmen kann man aber keine eigenen Icon´s zu ordnen oder?

    @RodFromGermany Die Imagelist und ZuOrdnung zum TreeView ist noch vorhanden. Jedoch die Zuordnung der Nodes zum Index der Icons, kann ich nicht durchführen, da die Nodes ja erst im "Betrieb" des Programms aus der XML geladen werden.

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

    @zauber777 Sieh Dir mal dieses Projekt an:
    TreeViewIcons.zip
    Doch, Du kannst dynamisch eine XML-Node auslesen, das Icon ermitteln, an die ImagerList hängen und dem TreView-Node zuordnen.
    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. Mein Ziel war es aber eigentlich das Programm nur einmal zu erstellen und dann kann jeder meiner Freunde/Kollegen/Bekannten den TreeView erweitern per XML, wie man es möchte. Nur dass man dann das Icon für das neu hinzugefügte Programm mit hinterlegen muss im "Icon-Ordner".

    Hier sieht man, dass er versucht das Icon zu laden, aber es nur weiss angezeigt wird


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

    zauber777 schrieb:

    nur einmal zu erstellen
    Was hindert Dich daran?
    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 Du wirst verzeihen, dass ich in meinem Beispiel meinen Code nicht an Deine Bedürfnisse angepasst habe, das musst Du selber tun.

    RodFromGermany schrieb:

    Doch, Du kannst dynamisch eine XML-Node auslesen, das Icon ermitteln, an die ImagerList hängen und dem TreView-Node zuordnen.
    Wenn das Icon als Datei vorhanden ist, hängst Du es in dem Moment, wo Du den XML-Node ausliest (ich nehme mal an, dass die XML-Datei nicht in Deinem Programm fest programmiert ist), an die hoffentlich erstellte ImageList.
    In diesem Moment kennst Du den aktuellen Index eben dieses Icons in der ImageList, nämlich ImageList1.Count - 1.
    Diesen Index gibst Du dem gerade zu erstellenden TreeView-Node als ImageIndex mit.
    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!
    Leider hänge ich immer noch meinem Problem fest...
    Ich habe auch schon versucht einen Beispiel Code im Netz zu finden, bei welchen die Icons hinzugefügt werden aus der XML. Leider ohne Erfolg...

    Theoretisch habe ich nur raus gefunden, wie ich die Icons der Imagelist hinzufüge... Aber ich weiss absolut nicht weiter und hoffe dass ihr mir doch nochmal weiterhelfen könnt!?

    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

    zauber777 schrieb:

    VB.NET-Quellcode

    1. XmlTreeView.LoadFromXml(...)
    Was ist das?
    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 da liegt das Problem. Ich weiß leider absolut nicht, wie ich es machen soll, dass er den Parameter nicht ignoriert!?!?

    Ich habe leider nur einen Grundkurs vor vielen Jahren im Programmieren, auf damals noch QBasic, gehabt.
    Daher hoffe ich, dass ihr mir meine Unwissenheit verzeiht.

    ​der Parameter "Icon" (was immer das sein mag)


    Hier nochmal die XML bei welcher der "Icon"-Parameter mit angegeben ist :

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <Nodes>
    3. <Node Text="Programme" Icon="Folder.ico">
    4. <Node Text="Test" Icon="Prog.ico">
    5. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe" Icon="I:\TestProgramm\Icon\VS.ico">Visual Studio</Programm>
    6. <Programm Path="C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" Icon="I:\TestProgramm\Icon\Excel.ico">Excel</Programm>
    7. </Node>
    8. <Node Text="andere" Icon="FAL.ico">
    9. <Programm Path="C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE" Icon="I:\TestProgramm\Icon\VB.ico">VB.NET</Programm>
    10. </Node>
    11. <Node Text="Test1" Icon="Test.ico">
    12. <Programm>bla</Programm>
    13. <Programm>blup</Programm>
    14. </Node>
    15. </Node>
    16. </Nodes>

    zauber777 schrieb:

    Ich weiß leider absolut nicht, wie ich es machen soll, dass er den Parameter nicht ignoriert!?!?
    Poste mal den Code der Prozedur XmlTreeView.LoadFromXml(...).
    Du musst eine ImageList aufbauen und Dir merken, welche Bilder mit welchem Index da bereits drinne sind, um nicht Bilder zwei Mal zu laden. Verwende dazu ein Dictionary(Of String, Index).
    Dann liest Du den Namen und stellst fest, ob es bereits vorhanden ist. Wenn ja, gib dem Node den vorhandenen Index.
    Wenn nein, lies ggf. die Bilddatei ein, füge sie der ImageList hinzu und füge den Namen und den Index dem Dictionary hinzu und den Index dem Node.
    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!