Forum: PC-Programmierung C#: TextBox Strg + V abfangen


von Daniel (Gast)


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

von Markus V. (valvestino)


Lesenswert?

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

von mar IO (Gast)


Lesenswert?

Bringt dich das "TextBox.AcceptsReturn-Eigenschaft" vllt. auch weiter?

http://msdn.microsoft.com/de-de/library/system.windows.forms.textbox.acceptsreturn.aspx

von Arc N. (arc)


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
    }

von Daniel (Gast)


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...

von Thomas E. (thomase)


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.

von Daniel (Gast)


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

von Markus V. (valvestino)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.