Treeview Inhalt per Mausklick Öffnen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Andy2002.

    Treeview Inhalt per Mausklick Öffnen

    Hallo,
    ich habe folgenden Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim childEntry As DirectoryEntry
    2. Dim ParentEntry As New DirectoryEntry
    3. Timer1.Stop()
    4. Try
    5. ParentEntry.Path = "WinNT:"
    6. For Each childEntry In ParentEntry.Children
    7. Dim newNode As New TreeNode(childEntry.Name)
    8. Select Case childEntry.SchemaClassName
    9. Case "Domain"
    10. Dim ParentDomain As New TreeNode(childEntry.Name)
    11. TreeView1.Nodes.AddRange(New TreeNode() {ParentDomain})
    12. Dim SubChildEntry As DirectoryEntry
    13. Dim SubParentEntry As New DirectoryEntry
    14. SubParentEntry.Path = "WinNT://" & childEntry.Name
    15. Dim x = childEntry.AuthenticationType()
    16. For Each SubChildEntry In SubParentEntry.Children
    17. Try
    18. Select Case SubChildEntry.SchemaClassName
    19. Case "Computer"
    20. Dim newNode1 As New TreeNode(text:=$"Name : {SubChildEntry.Name} IP: {Net.Dns.Resolve(SubChildEntry.Name).AddressList(0)}")
    21. ParentDomain.Nodes.Add(newNode1)
    22. End Select
    23. Catch ex As Exception
    24. Debug.WriteLine(SubChildEntry.Name)
    25. End Try
    26. Next
    27. End Select
    28. Next
    29. Catch Ex As Exception
    30. MessageBox.Show(Ex.ToString)
    31. Finally
    32. ParentEntry = Nothing
    33. End Try

    Dieser füllt eine Treeview mit Lokalen Ip Adressen der Geräte im Netzwerk. Ich möchte nun wenn ich auf eine Ip Adresse Klicke diese öffnen. Also Z.b. im Format: \\100.100.100.2\ (Gibt man diese im Windows Adresszeilen ein gelangt man zur Freigabe des Entsprechenden Pc´s.)
    Ich wollte das Ganze so gestallten, man Klickt die Endsprechende Zeile an, und dann mit einen Button öffnet sich ein Windows Explorer Fenster mit den Inhalten des PC´s.

    Die Adressen werden in den

    VB.NET-Quellcode

    1. Treeview1.Nodes
    Angezeigt.
    Und was ist jetzt das Problem? Ich tippe mal darauf, dass Du weißt, dass Du mit DeinTreeView.SelectedNode schon mal an den ausgewählten Knoten kommst. Jetzt könntest Du mit DeinTreeView.SelectedNode.Text an den Text kommen, der aber bei Dir aus dem hier besteht: Name : {SubChildEntry.Name} IP: {Net.Dns.Resolve(SubChildEntry.Name).AddressList(0)}. Entweder Du pfriemelst den wieder mit Split auseinander. Oder Du speicherst die IP in der Tag-Property des Knotens und nimmst eben jene Tag-Property bei Button-Click her, um dann mit der IP machen zu können, was Du eben machen willst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Andy2002 Du kannst die .Tag-Property nutzen, Deine IP-Adresse als solche (nicht String) zu hinterlegen.
    Mit

    VB.NET-Quellcode

    1. Dim adr = CType(MyTreeView.SelectedNode.Tag, IPAddress)
    hast Du die IP-Adresse in einer Variable vom richtigen Typ.
    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!
    @Andy2002 1.: Erweiterte Antwort => Dateianhänge => Hochladen.
    Bau Dir den String vor Process zusammen und verifiziere ihn.
    Probierma

    VB.NET-Quellcode

    1. Process.Start("net.exe", $"://{adr}/")
    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!
    LOL..
    "duck und weg" :)

    Gut der Aufruf klappt schonmal, jetzt sollte sich das Fenster net.exe sich nur nicht sofort Schließen..
    Bzw... statt net.exe würde ich lieber den Datei Explorer nutzen.. ist das immer noch explorer.exe?

    Ich habe nun das Problem das adr Nothing ist und deswegen kein Aufrufen möglich ist.

    Quellcode

    1. Treeview1.Selectnode.tag
    ist Nothing sowie adr Nothing ist. Frage ist warum wird die Adresse nicht übergeben? Was hab ich vergessen?
    Bilder
    • hmm.jpg

      734,68 kB, 3.840×2.160, 34 mal angesehen

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

    @Andy2002 Der erste Parameter ist die Exe allein, alles was danach kommt, kommt danach.

    VB.NET-Quellcode

    1. Process.Start("Explorer.exe", $"/e :\\{adr}/")
    Wenn Tag Nothing ist, wurde kein Tag zugewiesen oder durch Manipulation wieder gelöscht.
    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!
    Daher vorher mithilfe von If auf Nothing testen, damit dann der Prorammierer sich um eine Exception weniger kümmern muss. Und ggf. ein etwas gezielteren Screenshot hochladen. Ein Bild mit der Auflösung 3840x2160 auf einen deutlich kleineren Monitor zu inspizieren, ist ein wenig anstrengend.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. Process.Start("Explorer.exe", $"/e :\\{adr}/")

    Wenn ich das so eingebe, dann kommt der Dokumenten Ordner, der Befehl /e ist für den Explorer.exe und dient dazu den folgenden Pfad direkt zu öffnen. @VaporiZed sobald der code Funktioniert kommt eine If Schleife drum, vorher erspare ich mir das. (Kann ja sein das ich das ganze so gar nicht behalte und die Form einfach wieder lösche.) Weil ich da etwas unter Zeitdruck stehe.. Aber ich hab es mal umschlossen.

    VB.NET-Quellcode

    1. Private Sub VCon_Click(sender As Object, e As EventArgs) Handles VCon.Click
    2. Dim adr = CType(TreeView1.SelectedNode.Tag, IPAddress)
    3. If adr IsNot Nothing Then
    4. Process.Start("explorer.exe /e", $":\\{adr}/")
    5. End If
    6. End Sub


    Nur passieren tut so nichts...

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

    @Andy2002 Lesen bildet.
    Falsch:

    VB.NET-Quellcode

    1. Process.Start("explorer.exe /e", $":\\{adr}/")

    Richtig:

    VB.NET-Quellcode

    1. Process.Start("Explorer.exe", $"/e :\\{adr}/")

    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!
    Nun der Aufruf klappt immer noch nicht. Ich denke der Tag IPAddress wird nirgendwo gesetzt. Ich wüsste auch nicht wie ich den reinschreiben sollte. Vielleicht

    VB.NET-Quellcode

    1. Dim newNode1 As New TreeNode(text:=$"Name : {SubChildEntry.Name} IP: {Dns.Resolve(SubChildEntry.Name).AddressList(0)}")
    2. ParentDomain.Nodes.Add(newNode1)
    3. [color=#EE82EE]newNode1.tag = IPAddress[/color]


    Geht Natürlich nicht, weil IPAddress ein Klassentyp ist.
    Spoiler anzeigen

    Hab das jetzt so, jetzt wird der Tag "IPAddress" auch gefunden, aber der Aufruf sagt Datei nicht gefunden. Ich muss glaube ich die IP vom Hostnamen Trennen.

    VB.NET-Quellcode

    1. Dim childEntry As DirectoryEntry
    2. Dim ParentEntry As New DirectoryEntry
    3. Try
    4. ParentEntry.Path = "WinNT:"
    5. For Each childEntry In ParentEntry.Children
    6. Dim newNode As New TreeNode(childEntry.Name)
    7. Select Case childEntry.SchemaClassName
    8. Case "Domain"
    9. Dim ParentDomain As New TreeNode(childEntry.Name)
    10. TreeView1.Nodes.AddRange(New TreeNode() {ParentDomain})
    11. Dim SubChildEntry As DirectoryEntry
    12. Dim SubParentEntry As New DirectoryEntry
    13. SubParentEntry.Path = "WinNT://" & childEntry.Name
    14. Dim x = childEntry.AuthenticationType()
    15. For Each SubChildEntry In SubParentEntry.Children
    16. Try
    17. Select Case SubChildEntry.SchemaClassName
    18. Case "Computer"
    19. Dim newNode1 As New TreeNode(text:=$"Name : {SubChildEntry.Name} IP: {Dns.Resolve(SubChildEntry.Name).AddressList(0)}")
    20. ParentDomain.Nodes.Add(newNode1)
    21. newNode1.Tag = "IPAddress"
    22. End Select
    23. Catch ex As Exception
    24. Debug.WriteLine(SubChildEntry.Name)
    25. End Try
    26. Next
    27. End Select
    28. Next
    29. Catch Ex As Exception
    30. MessageBox.Show(Ex.ToString)
    31. Finally
    32. ParentEntry = Nothing
    33. End Try
    34. GC.Collect()
    35. End Sub
    36. Private Sub VCon_Click(sender As Object, e As EventArgs) Handles VCon.Click
    37. Dim adr = CBool(TreeView1.SelectedNode.Tag.ToString = "IPAddress")
    38. Process.Start("explorer.exe /e", $":\\{adr}/")
    39. End Sub
    40. End Class

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

    Du musst da natürlich Deine echte IP eintragen, also

    VB.NET-Quellcode

    1. newNode1.tag = Dns.Resolve(SubChildEntry.Name).AddressList(0)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    So wird die IP Adresse korrekt übergeben.

    VB.NET-Quellcode

    1. Case "Computer"
    2. Dim newNode1 As New TreeNode(text:=$"Name : {SubChildEntry.Name} IP: {Dns.Resolve(SubChildEntry.Name).AddressList(0)}")
    3. ParentDomain.Nodes.Add(newNode1)
    4. newNode1.Tag = Dns.Resolve(SubChildEntry.Name).AddressList(0)


    Jedoch klappt der Aufruf noch nicht.

    VB.NET-Quellcode

    1. Private Sub VCon_Click(sender As Object, e As EventArgs) Handles VCon.Click
    2. Dim adr = CType(TreeView1.SelectedNode.Tag, IPAddress)
    3. Process.Start("explorer.exe /e", $":\\{adr}\")
    4. End Sub

    Der Pfad soll sein \\IPAddress\ @RodFromGermany Wenn ich deine Version nehme wo die Syntax /e hinter dem Explorer.exe fehlt, dann öffnet sich nur der Dokumentenordner Standard, aber nicht der Pfad
    Error log

    VB.NET-Quellcode

    1. System.ComponentModel.Win32Exception
    2. HResult=0x80004005
    3. Nachricht = Das System kann die angegebene Datei nicht finden
    4. Quelle = System

    Als "Datei" ist in dem Beispiel die 192.168.178.17 IP Adresse gegeben. Jedoch muss die damit die Aufrufbar wird \\192.168.178.17\ heißen.
    Bilder
    • hmm.jpg

      173,44 kB, 1.644×593, 31 mal angesehen

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

    @Andy2002 Probier mal dies:

    VB.NET-Quellcode

    1. Dim address = $"http://{adr}/"
    2. Process.Start(address)
    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!
    Da wird der Webbrowser mit geöffnet. Kann man auch einfach mal Testen in der Ordner Adresszeile einfach mal google.de reinschreiben..
    Aber nein, es soll sich ja ein Ordner vom Ziel öffnen.
    (Netzwerk Freigaben)

    Könnte mir vorstellen das man vielleicht das mit einer smb Syntax machen muss. Also

    VB.NET-Quellcode

    1. Process.Start("explorer.exe /e", $"smb:\\{adr}\")
    @Andy2002 Was ganz genau soll in der Eingabezeile stehen?
    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!
    Hab zwar kein NAS oder Netzwerklaufwerk, aber wenn ich Diagnostics.Process.Start("Explorer.exe", "\\127.0.0.1\") ausführe, komm ich dahin, wo ich dachte, dass ich hinkomme.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed jop genau so sollte es gehen.
    Wenn ich da z.b direkt die IP Adresse rein Geschreibe und das andere aus kommentiere.

    VB.NET-Quellcode

    1. Private Sub VCon_Click(sender As Object, e As EventArgs) Handles VCon.Click
    2. Dim adr = CType(TreeView1.SelectedNode.Tag.ToString, String)
    3. 'Process.Start("explorer.exe /e", $"{ adr}")
    4. Process.Start("Explorer.exe", "\\192.168.178.17\")
    5. End Sub


    Öffnet er auch genau wie er soll einen Ordner mit dem Inhalt aus dem Pfad.
    Und jetzt meine Idee, da ich sehr sehr viele Geräte in Netzwerken habe, wollte ich die per Treeview Auflisten und dann eben mit SelectNode eben diese öffnen.
    Könnte Natürlich auch die IP Adressen alle Fest reinschreiben. Das ist aber bei neuen Geräten und oder Wechsel doof.

    Edit: Läuft, @VaporiZed hat mich auf die Idee gebacht


    VB.NET-Quellcode

    1. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    2. My.Forms.lade.Visible = False
    3. Dim childEntry As DirectoryEntry
    4. Dim ParentEntry As New DirectoryEntry
    5. Timer1.Stop()
    6. Try
    7. ParentEntry.Path = "WinNT:"
    8. For Each childEntry In ParentEntry.Children
    9. Dim newNode As New TreeNode(childEntry.Name)
    10. Select Case childEntry.SchemaClassName
    11. Case "Domain"
    12. Dim ParentDomain As New TreeNode(childEntry.Name)
    13. TreeView1.Nodes.AddRange(New TreeNode() {ParentDomain})
    14. Dim SubChildEntry As DirectoryEntry
    15. Dim SubParentEntry As New DirectoryEntry
    16. SubParentEntry.Path = "WinNT://" & childEntry.Name
    17. Dim x = childEntry.AuthenticationType()
    18. For Each SubChildEntry In SubParentEntry.Children
    19. Try
    20. Select Case SubChildEntry.SchemaClassName
    21. Case "Computer"
    22. Dim newNode1 As New TreeNode(text:=$"Name : {SubChildEntry.Name} IP: {Dns.Resolve(SubChildEntry.Name).AddressList(0)}")
    23. ParentDomain.Nodes.Add(newNode1)
    24. 'Dim newNode2 As New TreeNode(text:=$"{Dns.Resolve(SubChildEntry.Name).AddressList(0)}")
    25. 'ParentDomain.Nodes.Add(newNode2)
    26. newNode1.Tag = $"\\{Dns.Resolve(SubChildEntry.Name).AddressList(0)}\"
    27. End Select
    28. Catch ex As Exception
    29. Debug.WriteLine(SubChildEntry.Name)
    30. End Try
    31. Next
    32. End Select
    33. Next
    34. Catch Ex As Exception
    35. MessageBox.Show(Ex.ToString)
    36. Finally
    37. Timer2.Stop()
    38. scannew.Enabled = True
    39. My.Forms.lade.Close()
    40. ParentEntry = Nothing
    41. End Try
    42. GC.Collect()
    43. End Sub
    44. Private Sub VCon_Click(sender As Object, e As EventArgs) Handles VCon.Click
    45. Dim adr = CType(TreeView1.SelectedNode.Tag.ToString, String)
    46. Process.Start("Explorer.exe", $"{ adr}")
    47. End Sub
    48. End Class



    Einfach im newNode1.Tag die \\ hinzugefügt. Jetzt läuft es.

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