Treeview Knoten hinzufügen und Beschriften

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Alex74.

    Treeview Knoten hinzufügen und Beschriften

    Hallo,

    ich habe ein Treeview ( tvMedia). Dort soll dem Anwender die Möglichkeit gegeben werden, selbst Knoten zu erstellen. dies mache ich wie folgt.

    VB.NET-Quellcode

    1. Private Sub NewKnoten(Sender as Object,e as EventArgs) Handles NewKnoten.Click
    2. Modus = MyModus.Neu ' Die Variable brauch ich an anderen Stellen
    3. Dim NewNode As TreeNode = New TreeNode("Neue Kategorie") With {.Name = "Neue Kategorie", .Tag = Nothing, .ContextMenuStrip = Me.ContextMenuStrip1}
    4. tvMedia.TopNode.Nodes.Add(NewNode)
    5. tvMedia.LabelEdit = True
    6. If Not NewNode.IsEditing Then NewNode.BeginEdit()
    7. End Sub
    8. Private Sub tvMedia_BeforeSelect(sender As Object, e As TreeViewCancelEventArgs) Handles tvMedia.BeforeSelect
    9. e.Cancel = Not (Modus = MyModus.Show Or Modus = MyModus.Laden)
    10. End Sub
    11. Private Sub tvMedia_AfterLabelEdit(sender As Object, e As NodeLabelEditEventArgs) Handles tvMedia.AfterLabelEdit
    12. 'Noch prüfen ob Eintrag bereits in der Liste vorhanden ist
    13. If Trim(e.Label).Length = 0 Then
    14. Dim Bezeichner As String = ""
    15. Select Case e.Node.Level
    16. Case 1
    17. Bezeichner = " die Kategorie"
    18. Case 2
    19. Bezeichner = "die Gruppe"
    20. Case 3
    21. Bezeichner = "den Benutzer"
    22. End Select
    23. MessageBox.Show("Der Eintrag für " & Bezeichner & " darf nicht aus Leerzeichen bestehen oder eine Länge von 0 Zeichen haben! Bitte geben Sie " & Bezeichner & " richtig ein.", "Ungültige Eingabe", MessageBoxButtons.OK, MessageBoxIcon.Information)
    24. e.CancelEdit = True
    25. e.Node.BeginEdit()
    26. Else
    27. DirectCast(sender, TreeView).LabelEdit = False ' Es kann nix mehr bearbeitet werden
    28. e.Node.Name = e.Label ' Name wird zugewiesen an die Name Eigenschaft
    29. e.Node.Text = e.Label ' Text wird zugewiesen an die Text Eigenschaft
    30. e.Node.EndEdit(False) ' Node wird gespeichert im treeview
    31. DirectCast(sender, TreeView).SelectedNode = e.Node
    32. Modus = MyModus.Show ' Modus wird auf anzeigen gesetzt
    33. End If
    34. End Sub

    Soweit klappt alles, bis auf.
    Der neue Knoten wird angelegt und als vordefinierter Text steht "Neue Kategorie" da. Klickt man nun auf einen anderen Eintrag, ploppt 2 mal die Messagebox mit der Meldung auf die Daten richtig einzugeben. Genauso ploppt die Messagbox auch auf, wenn ich direkt Enter betätige, obwohl dort der vordefinierte Text steht. Auch ist e.Label immer Nothing solange ich nichts eingebe.

    Was ich halt erreichen möchte ist

    1: Das wenn auf einen anderen Knoten geklickt wird, nichts passiert
    2: Wenn direkt Enter gedrückt wird, der vordefinierte Text genommen wird
    3: Wenn die Zeichenlänge =0 ist oder nur aus Leerzeichen besteht, dann einmal die Messagebox angezeigt wird.

    Weiss jemand wo mein Fehler hier liegt und wie ich das ändern müsste?

    LG ALex

    CodeTags gesetzt ~VaporiZed

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

    @Alex74 Willkommen im Forum. :thumbup:
    Vielleicht ist es besser, Du postest das komplette Projekt.
    Wenn es zuu lang ist, mach ein neues Prlekt mit den erforderlichen Contgrols. Überzeuge Dich davon, dass die beschriebenen Effekte reproduziert werden.
    Bereinige das Projekt, zippe es (ohne obj, bin, vs-Ordner) und hänge es an Deinen (nächsten) Post:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Willkommen im Forum.

    Das erste Problem ist das VB6-Trim. Würdest Du in Zeile#15 If e.Label.Trim.Length = 0 Then schreiben, würde der Compiler zurecht meckern, wenn e.Label Nothing ist und an der Stelle abbrechen. Mit dem VB6-Trim hingegen wird der Code unsinnigerweise fortgesetzt.
    Nächster Punkt: e.Label ist ja der neue Text. Da Du aber schon einen Text in Z#3 vorgibst, wird "Neue Kategorie" nicht als geänderter Text angesehen und e.Label ist Nothing.
    Und ein weiteres Problem: Der Code kann erstmal nicht zwischen Bestätigung des Default-Textes und dem Wegklicken unterscheiden. Denn beides führt zu e.Label = Nothing. Daher ist das momentane Programm nicht in der Lage, Deinen Wünschen nachzukommen. Wenn Du Dir klassenweit merkst, dass Du im EditMode bist, könntest Du dies im TvMedia.BeforeSelect-EventHandler abfragen und den NewNode löschen. Ist aber ziemlich frickelig, finde ich. Zum einen müsstest Du NewNode klassenweit deklarieren, zum anderen müsstest Du dann auch die Escape-Taste abfangen, da das Drücken derselbigen sonst wie eine Bestätigung beim Compiler ankommt. Warum da nicht CancelEdit auf True automatisch gesetzt wird, weiß ich nicht. Aber das liegt auch daran, dass ich keine TreeViews nutze.
    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.
    HAllo VaporiZed,

    vielen Dank für deine ausführliche Erklärung. Ich habe einen anderen Weg gefunden, wie ich es realisiert habe. Ich zeichne eine Textbox über den selektierten Eintrag und frage diesen nun im KeyDown und LostFocus Ereignis ab und bearbeite dann dort die Einträge entsprechend :)