TextBox.Undo()



  • Hallo.

    Ich schreibe ein eigenes Kontextmenü für eine Text Box mit den Menuitems Ausschneiden, Löschen, Kopieren, Einfügen, Alles markieren und Rückgängig. Um die Eingabe in der Text Box rückgängig zu machen benutze ich die Methode TextBox.Undo().
    Mein Problem ist folgendes, wenn ich in die TextBox zum Beispiel den Text „Windows“ eingebe dann mit Hilfe des Kontextmenüs Lösche den markierten Text dann schreibe ich zum Beispiel den Text „Hallo“ rein und zum Schluss klicke ich im Kontextmenü auf den Item Rückgängig (wird die Methode Undo() aufgerufen) dann erscheint in der Text Box nichts.
    Sie ist dann leer. Es soll aber wieder „Windows“ angezeigt werden.
    Mache ich das noch mal aber diesmal benutze ich nicht das Kontextmenü zum löschen sonder die Taste Entf dann funktioniert das einwandfrei.
    Hängt das vielleicht damit zusammen wie das markierte Text in der Text Box gelöscht wird wenn man auf ten Item Löschen klickt.
    Etwa so: txtBox.SelectedText = " " ;
    Normalerweise soll die Methode Undo jede Operation an der Text Box wieder rückgängig machen. Irgendwo habe ich gelesen dass das aber nicht so ist. Bei bestimmten Bedingungen funktioniert sie nicht so wie sie eigentlich soll. Etwas Genaueres stand da aber auch nicht.
    Weiß vielleicht Jemand etwas genaueres?

    Grüß Irek68



  • ich sehe zwar keinen Sinn in einem "TextBox-Löschen" Menü und .NET Hilfe sagt auch, dass nur bestimmte operationen "geundotet" 😃 werden können:

    .., wird durch diese Methode die letzte Änderung im Textfeld-Steuerelement rückgängig gemacht, die mit der Zwischenablage oder einer Texteingabe vorgenommen wurde.

    , aber hier eine WinAPI Umsetzung deines Problems:

    using System.Runtime.InteropServices;
    ...
    private void delete_Click(object sender, System.EventArgs e)
    {
    	textBox1.SelectAll();
    	string s= "";
    	int o = SendMessage(textBox1.Handle, 194 /* EM_REPLACESEL */, 1 /* CAN_UNDO */, out s);
    }
    
    private void undo_Click(object sender, System.EventArgs e)
    {
    	textBox1.Undo();
    }
    
    [DllImport("user32.dll")]
    private extern static int SendMessage(IntPtr hwnd, int m, int w, out string l);
    


  • Hallo.
    Danke für die Antwort.
    Wenn man Kontext-Menü von einer TextBox aufklapt da befindet sich dort ein Menuitem "Löschen" und den möchte ich auch in meinem Kontextmenu anbieten.
    Wenn ich das etwa so schreibe:

    private void Klick_MenuitemDelete(object obj, EventArgs e)
    { txtBox1.SelectedText = "";}

    dann, funktioniert die Methode undo nicht. Oder wenn ich die Eigenschaft txtBox1.Text im Programm zur Laufzeit per Code verändere. Etwa beim klicken auf ein Button pasiert sowas: txtBox1.Text = ""; .Funktioniert die Methode auch nicht. Es gibt kein zurück mehr.
    Grüß...



  • Du hast ein Problem, dass beim Löschen oder Zuweisen des Textes im Code die Undo Funktion nicht mehr funktioniert. Ich habe dir ne Lösung vorgeschlagen, die dies umgeht. Was gefählt dir dabei nicht?

    wenn string s leer ist (""), dann wir der Inhalt der TextBox "gelöscht". wenn s = "XYZ", dann wird der Text mit "XYZ" ersätzt. das ist doch das, was du suchst?! oder?


Anmelden zum Antworten