C#: TextBox Strg + V abfangen

Gast #2097396
Hallo!

Ich habe eine einzeilige Textbox, in der der Benutzer Code einfügen 
(Strg + V) kann.
Wenn der Benutzer aber nun einen Text einfügt, der Zeilenümbrüche 
enthält kommt es zu Fehlern.
Des Wegen habe ich über das KeyDown-Event das Einfügen abgefangen und 
den Text angepasst. Das funktioniert auch. Eigentlich. Das Problem ist, 
dass nachdem mein Keydown-Event und TextChanged-Event ausgeführt wurden. 
Kommt dann noch mal ein TextChanged-Event, diesesmal mit dem 
Originaltext.

Wie kann ich verhindern, dass nach dem Abfangen der Tasten Strg + V 
nochmal der Text eingefügt wird?

Gruß
Daniel
Hallo Daniel,

der meiner Meinung nach bessere Weg wäre, nicht die Tasten-Kombination 
<Ctrl-V> abzufangen, sondern diese ganz normal auszuführen und die 
"Taste" <Enter> abzufangen. Dazu solltest Du auch nicht unbedingt das 
KeyDown-Event nehmen sondern das KeyPress-Event.

Gruß
Markus
mar IO schrieb:
> Bringt dich das "TextBox.AcceptsReturn-Eigenschaft" vllt. auch weiter?
>
> 
http://msdn.microsoft.com/de-de/library/system.windows.forms.textbox.acceptsreturn.aspx

Nein, was z.B. gehen würde wäre so was in dieser Art
1
    void textBox_KeyUp(object sender, KeyEventArgs e) {
2
        if (e.KeyData == (Keys.Control | Keys.V)) {
3
            if (Clipboard.ContainsText()) {
4
                string temp = Clipboard.GetText(TextDataFormat.Text);
5
                temp = temp.Replace("\r\n", " ");
6
                temp = temp.Replace("\t", " ");
7
                textBox.Text = temp;
8
            }
9
            e.Handled = true;
10
        }
11
    }
Gast
Arc Net schrieb:
> void textBox_KeyUp(object sender, KeyEventArgs e) {
>         if (e.KeyData == (Keys.Control | Keys.V)) {
>             if (Clipboard.ContainsText()) {
>                 string temp = Clipboard.GetText(TextDataFormat.Text);
>                 temp = temp.Replace("\r\n", " ");
>                 temp = temp.Replace("\t", " ");
>                 textBox.Text = temp;
>             }
>             e.Handled = true;
>         }
>     }

Das ist 1:1 mein Code. Der Unterschied zwischen KeyDown und KeyUp:
Bei Down kommt das zweite Einfügen danach, bei Up davor.
Und bei KeyPressed kann ich nicht Strg + V gleichzeitig abfangen...
Das geht doch viel einfacher:

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text.Replace("\n", "");
            textBox1.Text = textBox1.Text.Replace("\r", "");
        }

Wichtig: textbox1.Multiline = true;

Sonst werden nur die Zeichen vor dem ersten "\" angenommen.

Keine Angst, die Textbox bleibt einzeilig.


mfg.
Gast
Hallo!

Diese Lösung ist meine aktuelle. Der Nachteil:
In der TexrChanged-Event Methode wird der Inhalt ausgewertet.
Ich lauf auf jeden Fall zweimal durch, auch wenn ich nachdem Replace via 
return die Methode wieder verlasse. Ich wollte das von vorne herein 
verhindern...

Gruß
Daniel
Zugegebenermaßen, mein erster Post zu Deinem Problem war wohl nicht ganz 
korrekt. ;-)

So wie ich es jetzt ausprobiert habe (unter der Voraussetzung, ich habe 
Dein Problem richtig verstanden), ist aber das KeyPressed-Event immer 
noch das richtige, an das Du Dich ranhängen solltest.

Mein Beispiel-Eventhandler filtert Zeilenumbrüche heraus und ersetzt sie 
durch ein Blank:
1
{
2
    ...
3
    myTextBox.KeyPress += KeyPressEventHandler;
4
    ...
5
}
6

7
private void KeyPressEventHandler( object sender,KeyPressEventArgs e )
8
{
9
    if ( e.KeyChar == Convert.ToChar(22) )
10
    {
11
        string temp = Clipboard.GetText(TextDataFormat.Text).Replace( "\r",string.Empty ).Replace( "\n"," " );
12
        myTextBox.Text = temp;
13
        e.Handled = true;
14
    }
15
}

Über die Art und Weise, wie die Zeilenumbrüche herausgefiltert werden, 
läßt sich sicherlich diskutieren, der Handler wird aber nur einmal 
aufgerufen und das Property AcceptsReturn muß auch nicht gesetzt werden, 
weil willst Du ja nicht, dass Returns erlaubt sind.

Gruß
Markus

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.