Auf das löschen von Zeichen in einer RichTextbox reagieren

  • Allgemein

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Auf das löschen von Zeichen in einer RichTextbox reagieren

    Hallo, ich stehe vor einem ziemlich kniffligen Rätsel:

    Ich habe eine Richtextbox die neben normalen Text auch noch von mir definierte Tags enthält (die Tags werden in der Datenbank gespeichert und von einem anderen Programm weiterverarbeitet). Die Tags sind so aufgebaut:

    [<inhalt>] (der Inhalt befindet sich zwischen 2 Eckigen Klammern)

    also könnte der Inhalt der Richtextbox so aussehen:

    ....[..]....[....]...[..].....[...]...

    nun kann es passieren, dass wenn man mit Backspace ein Zeichen löscht, dass man eine eckige Klammer von einem Tag erwischt, was schwerwiegende Folgen hat!!

    Gibt es eine Möglichkeit festzustellen was für ein Zeichen gelöscht wurde und wenn es sich um "]" handelt, löscht das Programm automatisch bist zum nächsten "[" weiter, so dass man nur ganze Tags löschen kann??

    Wenn ja, geht das bestimmt auch irgendwie mit anders rum (also mit der Entf-Taste)

    Für konstruktive Antworten bin ich sehr dankbar :) (auch wenn es sich meiner Meinung nach um eine beknackte Aufgabe handelt 8| )
    in Alles über Events ist eine Rtb geproggt, die nur Zahlen akzeptiert.
    Die arbeitet so, dass bei jedem _SelectionChanged-Event geprüft wird, ob der neue Gesamt-Text zulässig ist, und falls nicht, wird der vorherige Text wieder genauso hergestellt.

    Du müsstest also nur eine auf deine Bedürfnisse zugeschnittene Prüfung dranprogrammieren.
    Willkommen im Forum. :thumbup:
    Fang zunächst etwas einfacher an und sieh Dir das TextChanged-Event an.

    VB.NET-Quellcode

    1. Private textFirst As String = ""
    2. Private Sub RichTextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles RichTextBox1.TextChanged
    3. ' hier z.B. Änderungen detektieren
    4. textFirst = RichTextBox1.Text
    5. End Sub
    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!

    Funktioniert noch nicht richtig

    Danke für die Tipps,

    das Problem beim TextChanged-Event ist nur, dass es zu "spät" ausgelöst wird, also erst wenn das Zeichen mit Backspace schon gelöscht ist.

    Hab ihr noch andere Ideen?? Oder habe ich etwas falsch verstanden??
    Du kannst auch das KeyDown-Event nehmen und abfragen, welche Taste gedrückt wird.
    Das Problem ist, dass du den Text mit allem möglichen modifizieren kannst, außer durch das Löschen einzelner Zeichen.
    Z.B. durch Select und überschreiben oder durch Cut&Paste.
    Letztendlich wird dir nichts anderes übrig bleiben, als bei jeder Textänderung den kompletten Puffer neu zu parsen.

    Der Ansatz aus Post 4 ist da schon die richtige Wahl.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Clay schrieb:

    Hab ihr noch andere Ideen?
    Post #4 lesen und verstehen. :D
    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!
    Es gibt noch endere Möglichkeiten (wie immer):
    Die Richtextbox hat eine Eigenschaft SelectionProtected und ein Event, dass bei Änderungen von als gechützt gekennzeichnetem Text gefeuert wird (Protectet). Du kennzeichnest also zu schützenden Text und kannst im Event reagieren.
    Eine andere Variant wäre die Darstellung des Textes in einer bestimmten Formatierung z.B. in Zeilen oder einem Datagridview ohne die Klammern. Die Klammern werden dann nach der Bearbeitung wieder hinzugefügt. Das halte ich für die bessere Variante, weil der Nutzer nix falsches löschen kann.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Dann bring ich ihn um :cursing:

    ne spaß, :D

    Wenn der Benutzer mit der Maus in ein Tag hinein klickt, fange ich das MouseClick Event ab und setze den Schreib-Cursor (oder wie dieser Strich heißt) mit SelectedText hinter das Tag, wo der User kein "Schaden" anrichten kann. Dann kann er dann soviel Cut & Pasten wie er lustig ist.

    aber Danke für den Hinweis :)
    Oder das er die Hälfte des Tags markiert und mit Entfernen löscht.
    Ich denke, das wird ziemlich umständlich.
    Ausserdem: Das Rechtsklickmenü gibts auchnoch ^^
    Auch kann man vor den Tag gehen und entfernen drücken.
    Oder man aktiviert Einfügen, geht vor einen Tag und drückt die Leertaste.
    Hach ja, so viele Möglichkeiten.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    Clay schrieb:

    Dann bring ich ihn um :cursing:
    Lernresistent?

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Private textFirst As String = ""
    2. Private Sub RichTextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles RichTextBox1.TextChanged
    3. ' hier z.B. Änderungen detektieren
    4. textFirst = RichTextBox1.Text
    5. End Sub
    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!