TreeView: Knoten verschieben (Ausschneiden + Einfügen)

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von simpelSoft.

    TreeView: Knoten verschieben (Ausschneiden + Einfügen)

    Hallo,
    ich möchte eine Art Windows Explorer nachbauen und nutze dafür das TreeView-Control. Ist mein erstes Projekt mit dem TreeView^^

    Mein Code bisher:

    VB.NET-Quellcode

    1. Private CutCopy As TreeNode
    2. Private CutCopyMode As Boolean = False 'False = Copy; True = Cut
    3. Private Sub conTreeCut_Click(sender As System.Object, e As System.EventArgs) Handles conTreeCut.Click
    4. CutCopy = Tree.SelectedNode
    5. CutCopyMode = True ' = Cut
    6. Tree.Nodes.Remove(Tree.SelectedNode)
    7. End Sub
    8. Private Sub ConTreeCopy_Click(sender As System.Object, e As System.EventArgs) Handles ConTreeCopy.Click
    9. CutCopy = Tree.SelectedNode
    10. CutCopyMode = False ' = Copy
    11. End Sub
    12. Private Sub conTreePaste_Click(sender As System.Object, e As System.EventArgs) Handles conTreePaste.Click
    13. If CutCopy Is Nothing Then Exit Sub
    14. Tree.SelectedNode.Nodes.Add(CType(CutCopy.Clone, TreeNode))
    15. Tree.SelectedNode.Expand()
    16. If CutCopyMode = True Then '= Cut
    17. My.Computer.FileSystem.MoveFile(GetRealPath(CutCopy.FullPath), GetRealPath(Tree.SelectedNode.Nodes.Find(CutCopy.Text, False)(0).FullPath))
    18. Else
    19. My.Computer.FileSystem.CopyFile(GetRealPath(CutCopy.FullPath), GetRealPath(Tree.SelectedNode.Nodes.Find(CutCopy.Text, False)(0).FullPath))
    20. End If
    21. End Sub


    Kopieren geht super, aber Ausschneiden nicht. Da kommt ein Fehler in Zeile 21:
    InvalidOperationException: Der vollständige Pfad kann nur abgefragt werden, wenn ein TreeNode zu einer TreeView hinzugefügt wurde. Dieser TreeNode wurde nicht zu einer TreeView hinzugefügt.

    Heißt auf Deutsch, dass die FullPath Eigenschaft nur von Knoten benutzt werden kann, die einem TreeView angehören - ich weiß. Aber duch Zeile 17 gehört der Knoten (besser: ein gleichnamiger Klon) ja zu dem Treeview. Da ich aber den Klon über die Find-Methode aufsuche, und dieser zu dem TreeView gehört, müsste doch die Eigenschaft FullPath verfügbar sein.
    Ich meine Zeile 23 geht auch Problemlos, und das ist fast derselbe Code.

    Kann mir jemand helfen? Kann mir das einer erklären?

    Vielen Dank!

    Mit freundlichen Grüßen
    Mikro Fahrrad
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    Richtig, aber in Zeile 21 beziehe ich mich doch auf den Klon. Oder nicht?

    VB.NET-Quellcode

    1. 'hier das relevante Snippet:
    2. Tree.SelectedNode.Nodes.Find(CutCopy.Text, False)(0).FullPath)
    3. 'Ich suche in dem selektierten Knoten nach dem gerade hinzugefügten Klon aufgrund des Namens des gelöschten Knotens.
    4. 'Und ja, der Name ist noch da. Der Debugger sagt, dass der String korrekt ist.


    Ich verstehe nur abslout nicht, warum zähle 23 einwandfrei läuft und Zeile 21 nicht.
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    Hä? Ich raff es nicht xD

    Ich suche doch in dem TreeView (genauer: in dem gerade angewählten Knoten des Treeviews) mit "Find()" nach dem in Zeile 17 hinzugefügten Knoten. Und als Suchkriterium dient mir der Name von dem Knoten "CutCopy", der nicht zum TreeView gehört. Muss er auch nicht, ich brauche nur den Namen (also den Text).

    Wenn die Suche nichts finden würde, würde die Exception anders heißen. Also er findet den richtigen.
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^

    Mikro Fahrrad schrieb:

    Ich suche doch in dem TreeView (genauer: in dem gerade angewählten Knoten des Treeviews) mit "Find()" nach dem in Zeile 17 hinzugefügten Knoten.
    also in dem gezeigten Code gibts diese Suche nicht - oder welche Zeile wäre das?

    ach in post#3 nun. jo - keine Ahnung - sehe da keinerlei Zusammenhang - vlt. posteste nochmal, wie dein Code nu wirklich aussieht.

    ErfinderDesRades schrieb:


    vlt. posteste nochmal, wie dein Code nu wirklich aussieht.


    In dem ersten Post steht der gesamte Code, der für Kopieren / Einfügen verantwortlich ist.
    Der Code aud Post #3 stammt aus Post #1 Zeile 21 - die Zeile, die das Problem verursacht.
    Ich habe in Post #3 bloß den relevanten Teil herauskopiert, da Zeile 21 aus Post #1 ein wenig unübersichtlich ist^^

    Vielleicht noch die Anmerkung:
    GetRealPath() Ist eine Funktion, die den "virtuellen Pfad" des TreeViews in einen "echten" Pfad auf dem Computer übersetzt. Die Änderungen im TreeView müssen in einem Explorer ja unmittelbare Auswirkungen auf die Dateien haben, die durch die Knoten repräsentiert werden.

    Im Grunde könnte man Zeile 21 auch so schreiben - reine Geschmackssache:

    VB.NET-Quellcode

    1. Dim SourceFile As String = GetRealPath(CutCopy.FullPath) 'also z. B. = "D:\Meine Dokumente\test.rtf"
    2. Dim DestinationFile As String = GetRealPath(Tree.SelectedNode.Nodes.Find(CutCopy.Text, False)(0).FullPath)' also z. B. = "D:\Ordner\Unterordner 1\test.rtf"
    3. My.Computer.FileSystem.MoveFile(SourceFile, DestinationFile)


    Anmerkung 2: Ja, bisher geht es nur für Dateien.(weil "MoveFile" / "CopyFile"). Kommt dann auch eine Fallunterscheidung für Ordner - aber vorher sollte erst mal alles klappen.
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    ah - da hinten!

    VB.NET-Quellcode

    1. My.Computer.FileSystem.MoveFile(GetRealPath(CutCopy.FullPath), GetRealPath(Tree.SelectedNode.Nodes.Find(CutCopy.Text, False)(0).FullPath))


    Und ich hab nur bis weiter vorne geguckt:
    My.Computer.FileSystem.MoveFile(GetRealPath(CutCopy.FullPath), GetRealPath(Tree.SelectedNode.Nodes.Find(CutCopy.Text, False)(0).FullPath))

    :P
    Ja, ich habs in den Post über dir nochmal helferfreundlicher geschrieben^^

    (Normalerweise kriegt mein Code niemand außer mir zu Gesicht - da stören solche "spontanen Einzeler" nicht)


    EDIT:
    Du hast Recht! DA IST DER FEHLER! Danke!
    Ich dachte die ganze Zeit, der meckert wegen hinten^^ Da habe ich mir aber selbst ein Ei gelegt. - Das muss wohl die Hitze sein :D
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    Vorschlag zum Workflow:
    Schmeiß die CopyMode-Variable raus, und nenne CutCopy um auf ndClipboard oder so.
    Wenn Cut geklickst wird, dann weise den SelectedNode an ndClipboard zu, und entferne ihn aussm Tree.
    Wenn Copy geklickst wurde, dann weise einen Klon an ndClipboard zu.
    Jo, und beim Pasten halt einfügen - ist ja egal ob der Node zuvor ausgeschnitten wurde oder geklont.

    ErfinderDesRades schrieb:

    [...] und entferne ihn aussm Tree.


    Genau das war ja das Problem. Wenn ihn entferne, komme ich nicht mehr an .FullPath. Ich brauche aber den Ausgangspfad, um das Verschieben nachher auch im Dateisystem umsetzen zu können.

    Auf jeden Fall merke ich gerade, dass so ein Projekt ziemlich heftug ist (für einen Anfänger). Man muss auf so vieles aufpassen:
    - Wenn der Bernutzer die Datei ausschneidet, aber nie einfügt, muss sie noch vorhanden sein
    - Der Nutzer darf keine Datei in eine Datei einfügen
    - Der Nutzer darf keine Datei einfügen, wenn eine Datei mit demselben Namen bereits existiert
    - Man muss aufpassen, wenn der Nutzer die Datei an derselben Stelle einfügt, wo er sie ausgeschnitten hat.

    Bevor ich also selbst zusammenbaue:
    Gibt einen Quelloffenen Windows-Explorer-Klon in VB.NET? Hat sowas schonmal jemand gebastelt?
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    Mal sehen wie weit ich komme. Vielen Dank für die Links und die Unterstützung.

    Ich lege mich jetzt erstmal in die Sonne :D
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^

    ErfinderDesRades schrieb:

    Ich - und es ist ziemlich heftig


    ..kann kein drag&drop und schießt sich beim Verlassen des System32 Ordners selbst so ins Knie, das nicht mal eine Exception geschmissen wird.
    Edith sacht: nun isser doch wieder aufgewacht - hat ein kleines Nickerchen gemacht :D


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

    meinst du damit mein Werk? Das ist doch nur ein Treeview, damit kann man System32 doch garnet "verlassen".
    Und immerhin kann es Drag-Drops empfangen und drauf reagieren.
    Es ist halt nur ein Control, und keine Anwendung, daher führt das Teil natürlich auch keine Verschiebe-/Kopier-Vorgänge aus und dergleichen.