C#: TextBox Strg + V abfangen

Gast #2097396
Lesenswert?
• ▲
▼
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
#2097649
Lesenswert?
• ▲
▼
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 #2097957
Lesenswert?
• ▲
▼
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...
#2098006
Lesenswert?
• ▲
▼
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 #2098051
Lesenswert?
• ▲
▼
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
#2098960
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren