KeyPress Cancel (effektiv und sauber gelöst)

  • C#

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Steppenpferd.

    KeyPress Cancel (effektiv und sauber gelöst)

    Hallo allerseits,
    bis heute habe ich keinen effektiven Lösungsansatz zu diesem Thema im Internet gefunden (korrigiert mich bitte wenn ich da falsch Liege!)
    Deshalb habe ich mir mal Gedanken darüber gemacht wie man das KeyPress-Event möglichst schnell und effektiv Händeln kann.

    Die Idee dahinter ist einen String zu verwenden, der eine eindeutige Identifizierung der Eingabe ermöglicht.
    Im Grunde wurde dies nun durch einen 2 Zeiler realisiert.

    Hierzu übergebe ich euch ein String-Builder-Tool, mit dem der benötigte String generiert und getestet werden kann.
    Der Quellcode zum selber nachbauen versteckt sich im Spoiler weiter unten ;)

    Diese beiden Zeilen sind von Bedeutung, wenn ihr in eurem Code das KeyPress-Event Händeln wollt.

    C#-Quellcode

    1. string exceptedChars = "Hier steht dann Quasi der mit dem Tool generierte Text drinne.";
    2. if (!exceptedChars.Contains($"{e.KeyChar}")) e.Handled = true; // und diese Zeile steht in eurem KeyPress-Event



    und nun viel Spaß beim Testen!


    Quellcode
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Windows.Forms;
    3. using System.Threading;
    4. // used controls:
    5. // Label lblInputExceptedChars "Enter excepted chars here."
    6. // TextBox tbInputExceptedChars
    7. // Button btnStringToClipboard "Copy string to Clipboard"
    8. // Label lblOutputExceptedChars "Your characters-string."
    9. // TextBox tbOutputExceptedChars
    10. // Label lblTestExceptedChars "Test excepted chars here."
    11. // TextBox tbTestExceptedChars
    12. // Button btnClearAll "Clear all"
    13. namespace KeyPressCancel {
    14. public partial class Form1 : Form {
    15. string exceptedChars = "";
    16. public Form1() {
    17. InitializeComponent();
    18. }
    19. private void tbTestExceptedChars_KeyPress(object sender, KeyPressEventArgs e) {
    20. if (!exceptedChars.Contains($"{e.KeyChar}")) e.Handled = true;
    21. }
    22. private void tbInputExceptedChars_KeyPress(object sender, KeyPressEventArgs e) {
    23. tbOutputExceptedChars.Text += $"{e.KeyChar}";
    24. exceptedChars = tbOutputExceptedChars.Text;
    25. }
    26. protected void btnStringToClipboard_Click(object sender, EventArgs e) {
    27. if (tbOutputExceptedChars.TextLength < 3) return;
    28. Thread cbThread = new Thread(clipboard_SetText => Clipboard.SetText(tbOutputExceptedChars.Text)) { IsBackground = false };
    29. cbThread.SetApartmentState(ApartmentState.STA);
    30. cbThread.Start();
    31. }
    32. private void btnClearAll_Click(object sender, EventArgs e) {
    33. exceptedChars = "";
    34. tbInputExceptedChars.Text = "";
    35. tbOutputExceptedChars.Text = "";
    36. tbTestExceptedChars.Text = "";
    37. }
    38. }
    39. }
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)

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

    Weiß auch nicht welches Problem damit gelöst werden soll. Zumal das auch überhaupt nicht „sauber“ ist mit den Strings. Besser man hätte mit der entsprechenden Enumeration gearbeitet.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ok das Problem ist wohl eher das VB.NET noch in meinem Kopf rumschwirrt :/
    Dort verarbeitet das KeyEventArgs ja KeyCode und nicht wie in C# KeyChar.
    Muss mich wohl erst noch dran gewöhnen das in C# alles einfacher ist und man mehr Möglichkeiten hat.

    @mrMo Ich verstehe grad nicht
    ​Besser man hätte mit der entsprechenden Enumeration gearbeitet.

    Ist das nicht viel aufwändiger und wie würde das z. B. aussehen?
    Ein Char ist doch ein Zeichen und ein String ist eine Zeichenfolge. Warum sollte man den String einer Enumeration vorziehen?
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    Ah ok es handelt sich um das KeyPress Event, nicht KeyDown. Hab ich überlesen sorry. Dort gibt es nämlich die KeyCode Enumeration (auch in C#).

    Jetzt verstehe ich auch was du da gemacht hast. Du willst verhindern das bestimmte Zeichen z.b. in eine Textbox eingegeben werden können, korrekt? Sollte dem so sein, was machst du wenn jemand „verbotene Zeichen“ per Copy&Paste in die Textboxt kopiert.

    Zudem finde ich die Aussage Hierzu übergebe ich euch ein String-Builder-Toolsehr missverständlich, da gar nicht mit der StringBuilder Klasse gearbeitet wird. Auch hätte ich eine List(Of T) oder nen Array statt des Strings verwendet um die Zeichen zu verwalten.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Copy&Paste kann man ja einfach über die ShortcutsEnabled Eigenschaft verhindern, wenn dies nicht erwünscht ist.
    Sollte es hingegen erwünscht sein, ist das genauere Eingabe-Händling jedoch sehr Programm spezifisch.

    Deshalb die Bindestriche in String-Builder-Tool. Im Prinzip ist es ja eine genaue Beschreibung wofür das Tool verwendet wird. Es wird ein String gebaut.
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)