Entferntes Item aus ListView auch aus dem TreeView entfernen, wie?

  • VB.NET

Es gibt 48 Antworten in diesem Thema. Der letzte Beitrag () ist von Sonderzeichen.

    Entferntes Item aus ListView auch aus dem TreeView entfernen, wie?

    Hey,
    Ich habe mir einen Explorer aus TreeView und ListView gebastelt. Das funktioniert auch alles, nur bin ich gerade beim Löschen von Dateien. Das Entfernen der Datei sowie aus dem Browser funktioniert, nur wie kann ich die Datei aus dem TreeView entfernen (Den Node im TreeView)? Ich möchte ungern andauernd den Browser neu laden :/

    Lg
    ...aber gut, dass wir darüber gesprochen haben!
    Dein Problem ist verständlich formuliert. :thumbsup:
    Du hast die Frage von @Sonne75: möglicherweise nicht verstanden.
    Welche Beziehung haben die Daten des einen Controls zu den Daten des anderen Controls, wenn ihre Anzeigen derselben Quelle entspringen?
    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!
    Hey @sonne75
    Die Nodes werden so erstellt:

    VB.NET-Quellcode

    1. ' Im Form_Load Event
    2. Dim x As Integer
    3. treeFolders.Nodes.Add("X:", "Privater Ordner")
    4. treeFolders.Nodes("X:").Tag = "X:"
    5. For Each SubDirectory As String In My.Computer.FileSystem.GetDirectories("X:")
    6. treeFolders.Nodes(x).Nodes.Add(SubDirectory, Mid(SubDirectory, 4))
    7. treeFolders.Nodes(x).Nodes(SubDirectory).Tag = SubDirectory
    8. Next

    Und hier:

    VB.NET-Quellcode

    1. Private Sub treeFolders_BeforeExpand(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles treeFolders.BeforeExpand
    2. Dim MyTopDirectoryInfo As System.IO.DirectoryInfo
    3. e.Node.Nodes.Clear()
    4. Try
    5. For Each TopDirectory As String In My.Computer.FileSystem.GetDirectories(e.Node.Tag)
    6. MyTopDirectoryInfo = My.Computer.FileSystem.GetDirectoryInfo(TopDirectory)
    7. e.Node.Nodes.Add(TopDirectory, MyTopDirectoryInfo.Name)
    8. e.Node.Nodes(TopDirectory).Tag = MyTopDirectoryInfo.FullName
    9. For Each SubDirectory As String In My.Computer.FileSystem.GetDirectories(CStr(e.Node.Nodes(TopDirectory).Tag))
    10. MyTopDirectoryInfo = My.Computer.FileSystem.GetDirectoryInfo(SubDirectory)
    11. e.Node.Nodes(TopDirectory).Nodes.Add(SubDirectory, MyTopDirectoryInfo.Name)
    12. e.Node.Nodes(TopDirectory).Nodes(SubDirectory).Tag = MyTopDirectoryInfo.FullName
    13. Next
    14. Next
    15. Catch
    16. End Try
    17. End Sub

    Wie man Nodes löscht weiß ich auch, nur weiß ich nicht wie ich..., folgende Situation:
    Ich möchte Ordner 2 löschen. Ordner 2 wurde erfolgreich gelöscht und wird aus der ListView entfernt. Nicht aber aus der TreeView. Wie kann ich Ordner 2 aus der TreeView löschen?

    @RodFromGermany
    Wie meinst du das?

    Lg
    ...aber gut, dass wir darüber gesprochen haben!

    Sonderzeichen schrieb:

    Wie meinst du das?
    Im Control1 wird ZustandA, im Control2 ZustandB derselben DataSource angezeigt (wenn ich Dich richtig verstanden habe).
    Wenn in der DataSource nun eine Veränderung vorgenommen wird vermöge eines Befehls in Control1, sollte das Control2 davon Kenntnis erhalten, z.B. in Form eines Events.
    Wenn Du dieses Event gut aufstellst (eigenes EventArgument mit den erforderlichen Informationen), sollte Control2 sich mit minimalem Aufwand updaten können.
    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!

    Sonderzeichen schrieb:

    Könntest du evtl. ein Beispiel machen?
    Tut mir Leid, aber mit einem TreeView habe ich noch nicht gearbeitet.
    Mach Du ein Beispiel und wir sehen gemeinsam drüber.
    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!
    @Sonderzeichen:: So etwa:

    VB.NET-Quellcode

    1. Public Event MyDeletingEvent(sender As Object, e As DeletingEventArgs)
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. ' hier wird iwas verändert
    4. Dim o As New MyObject ' dies hier nach Deinen Vorgaben festlegen
    5. RaiseEvent MyDeletingEvent(Me, New DeletingEventArgs(o))
    6. End Sub

    VB.NET-Quellcode

    1. Public Class DeletingEventArgs
    2. Inherits EventArgs
    3. Public Property myObject() As MyObject
    4. Public Sub New(o As MyObject)
    5. myObject = o
    6. End Sub
    7. End Class

    VB.NET-Quellcode

    1. Public Class MyObject
    2. ' Klasse, die Deine DataSource beschreibt
    3. ' Inhalt nach Deinen Vorgaben festlegen
    4. End Class
    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
    ?( Ich bin zu doof dafür. Ich versteh dein Beispiel nicht richtig. Ich nehme mir gleich nach der Mittagspause nochmal Zeit dafür und melde mich dann nochmal.
    Wo ist denn da festgelegt, dass der Node bzw. das Item aus der TreeView und ListView entfernt werden muss

    Lg
    ...aber gut, dass wir darüber gesprochen haben!

    RodFromGermany schrieb:

    Im Control1 wird ZustandA, im Control2 ZustandB derselben DataSource angezeigt (wenn ich Dich richtig verstanden habe).
    Wenn in der DataSource nun eine Veränderung vorgenommen wird vermöge eines Befehls in Control1, sollte das Control2 davon Kenntnis erhalten, z.B. in Form eines Events.
    Wenn Du dieses Event gut aufstellst (eigenes EventArgument mit den erforderlichen Informationen), sollte Control2 sich mit minimalem Aufwand updaten können.
    Das geht bei Treeview nicht auf.
    Es ist prinzipiell aufwändig, einen bestimmten Treenode innerhalb des Treeviews zu identifizieren.
    Man muss entweder - wie von Sonne75 vorgeschlagen - alle Treenodes durchsuchen, oder man schreibt eine intelligentere Suche, die sich anhand eines Pfades durch die Treenodes hangelt.

    ok - theoretisch kannst du auch der Datenklasse den Treenode mitteilen, der sie repräsentiert - dassis aber eine ziemlich greuliche Kopplung von Daten und Oberfläche.

    ErfinderDesRades schrieb:

    ziemlich greuliche Kopplung
    Wie gesagt, ich hab noch nicht mit TreeView gearbeitet, deswegen kann ich da nicht mit einem runden Beispiel aufwarten.
    Allerdings soll / muss das ganze natürlich in 2 Richtungen funktionieren.
    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
    Wie durchsuch ich die denn? Ich hab es mit For Each versucht, komme aber nicht weiter, dann wird garkein Node entfernt.

    VB.NET-Quellcode

    1. For Each node In Browser.treeFolders.Nodes()
    2. If node.Tag = selectedItem.Tag Then
    3. Browser.treeFolders.Nodes().Remove(node)
    4. End If
    5. Next node

    Es kommt im Code zwar kein Fehler, aber .Tag wird auch bei keiner Funktion vorgeschlagen.

    Lg
    ...aber gut, dass wir darüber gesprochen haben!
    Mach doch mal testweite nach der "For ..."-Zeile ein MsgBox(node.tag) rein.
    Danach müsste sich jeder Name des Tags angezeigt werden, wenn du das ganze durchläufst.

    Ich vermute jetzt mal, dass du hier keine Rückgabe erhalten wirst, bzw. wenn es doch auftaucht, der Vergleich als solches nicht erfolgreich ist...