mikrocontroller.net

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


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus Volz (valvestino)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mar IO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bringt dich das "TextBox.AcceptsReturn-Eigenschaft" vllt. auch weiter?

http://msdn.microsoft.com/de-de/library/system.win...

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mar IO schrieb:
> Bringt dich das "TextBox.AcceptsReturn-Eigenschaft" vllt. auch weiter?
>
> 
http://msdn.microsoft.com/de-de/library/system.win...

Nein, was z.B. gehen würde wäre so was in dieser Art
    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;
        }
    }

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus Volz (valvestino)
Datum:

Bewertung
0 lesenswert
nicht 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:
{
    ...
    myTextBox.KeyPress += KeyPressEventHandler;
    ...
}

private void KeyPressEventHandler( object sender,KeyPressEventArgs e )
{
    if ( e.KeyChar == Convert.ToChar(22) )
    {
        string temp = Clipboard.GetText(TextDataFormat.Text).Replace( "\r",string.Empty ).Replace( "\n"," " );
        myTextBox.Text = temp;
        e.Handled = true;
    }
}

Ü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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.