Entwickler-Ecke

WinForms - Weiterschalten mit ENTER Taste


Izze - Fr 06.02.09 18:08
Titel: Weiterschalten mit ENTER Taste
Hallo,

ich würde gerne beim Drücken der ENTER-Taste in Textboxen den Effekt einer TAB-Taste haben, also ein Durchschalten durch die einzelnen Boxen.

Folgendes habe ich gefunden:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private void textBoxKcal100_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar.Equals("\r"))
            {
                this.ProcessTabKey(true);
                e.Handled = true;
            }
        }


Es sieht gut aus, es macht keine Fehler, es hat aber auch überhaupt keinen Effekt.
Nix passiert beim Drücken der ENTER-Taste, es piepst nur. Warum nur? :roll:


jaenicke - Fr 06.02.09 19:17

Kommt es denn im if an? Also wird die Taste erfolgreich abgefangen?


JüTho - Fr 06.02.09 19:19

Mach den Vergleich mal so:

C#-Quelltext
1:
        if (e.KeyChar == (char)Keys.Return)                    

Gruß Jürgen


Izze - Fr 06.02.09 20:15

Nein, hilft nichts.

Bleibt dabei, keine Funktion.


PerryRhodan - Fr 06.02.09 20:17

Hallo,

Schieb die Behandlungsroutine mal bitte aus der OnKeyPress raus und verwende stattdessen die OnKeyUp.

Grüße
PerryRhodan


jaenicke - Sa 07.02.09 03:09

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Mach den Vergleich mal so:

C#-Quelltext
1:
        if (e.KeyChar == (char)Keys.Return)                    

Gruß Jürgen
user profile iconIzze hat folgendes geschrieben Zum zitierten Posting springen:
Nein, hilft nichts.

Bleibt dabei, keine Funktion.
Also bei mir geht das. :nixweiss:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                this.ProcessTabKey(true);
                e.Handled = true;
            }
        }
Mit deinem Quelltext wurde Equals zu false ausgewertet, so geht es aber.


Izze - Sa 07.02.09 11:04

Ich verstehe es auch nicht.

Hab ich evtl. irgendwo etwas weggenommen was jetzt fehlt?


jaenicke - Sa 07.02.09 13:35

Setz doch mal einen Haltepunkt auf Zeile 3 bei mir. Kommt das Programm dort an? Was passiert dann?


Izze - Sa 07.02.09 13:49

Nein, es wird dort nie angekommen. Zumindest hält das Programm dort nicht.
Return hat keinerlei Wirkung.


JüTho - Sa 07.02.09 14:27

Grrr... In einem anderen Forum wurde ich gerade darauf hingewiesen, dass KeyPress hier nicht funktioniert. (Das war mir zwar grundsätzlich bewusst, aber ich hatte es nicht beachtet.)
SDK-Doku/MSDN hat folgendes geschrieben:
Control.KeyPress-Ereignis
Das KeyPress-Ereignis wird nicht von Tasten für nicht druckbare Zeichen ausgelöst, wobei diese aber das KeyDown-Ereignis und das KeyUp-Ereignis auslösen.

Also ersetze die Prüfung in KeyDown oder KeyUp (mit "if(e.KeyCode == Keys.Return)"), und alles müsste klappen.

Gruß Jürgen


jaenicke - Sa 07.02.09 14:43

Aber warum funktioniert es denn bei mir? :gruebel:
Mein Projekt liegt im Anhang inkl. Exe (da nicht anders angegeben habe ich Visual Studio 2008 + .NET 3.5 benutzt).


Izze - Sa 07.02.09 14:45

Ich schau mal, moment.


Kha - Sa 07.02.09 14:50

user profile iconIzze hat folgendes geschrieben Zum zitierten Posting springen:
Nein, es wird dort nie angekommen.
Die Methode ist aber schon als Eventhandler des Ereignisses eingetragen?


Izze - Sa 07.02.09 14:52

Hmm, also mehr als kopieren und einfach den Namen der Textbox ersetzen geht ja nicht:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private void textBoxKcal100_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                this.ProcessTabKey(true);
                e.Handled = true;
            }
        }


Und hat keine Wirkung. Seltsam.

Ich bin ja noch sehr neu und unerfahren, hab ich an anderer Stelle evtl. unwissentlich etwas verbaselt was sich hier bemerkbar macht?


jaenicke - Sa 07.02.09 14:57

user profile iconIzze hat folgendes geschrieben Zum zitierten Posting springen:
Hmm, also mehr als kopieren und einfach den Namen der Textbox ersetzen geht ja nicht:
Hast du denn vorher auch nur kopiert?
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Die Methode ist aber schon als Eventhandler des Ereignisses eingetragen?

Denn du musst auf die Textbox klicken und dann rechts unten bei Properties mit dem Blitz auf Ereignisse umschalten und bei KeyPress das Event auch eintragen. (Bzw. beim C# Builder links unten unter Ereignisse)


Izze - Sa 07.02.09 15:03

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Denn du musst auf die Textbox klicken und dann rechts unten bei Properties mit dem Blitz auf Ereignisse umschalten und bei KeyPress das Event auch eintragen. (Bzw. beim C# Builder links unten unter Ereignisse)


Oh mein Gott ist das peinlich. :oops:

Nu gehts...sorry... :flehan:


JüTho - Sa 07.02.09 15:04

user profile iconIzze hat folgendes geschrieben Zum zitierten Posting springen:
Hmm, also mehr als kopieren und einfach den Namen der Textbox ersetzen geht ja nicht:

Doch. So etwas wird auch benötigt, das steht so ähnlich normalerweise in der Designer.cs:

C#-Quelltext
1:
textBoxKcal100.KeyPress += textBoxKcal100_KeyPress;                    

Wenn Code für einen EventHandler einfach kopiert wird, muss das manuell gemacht werden. Erst dadurch wird der EventHandler auch dem Event zugewiesen.

OK, erledigt (während ich das geschrieben und abgeschickt hatte, wart Ihr schon fertig).

Zum Problem mit KeyPress und KeyDown/KeyUp:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Aber warum funktioniert es denn bei mir?

Hmm, vielleicht wird Return als druckbares Zeichen verstanden (weil es beim Drucken eine neue Zeile produziert).

Wenn ich mir verschiedene Hinweise in der SDK-Doku/MSDN durchlese, habe ich den Eindruck, dass NET selbst die Return-Taste nicht einheitlich verarbeitet. (Vielleicht geht das sogar auf Win-API zurück, so genau weiß ich das auch nicht.)

Vielleicht sollten wir es so machen: Cursortasten sind eindeutig "nicht druckbar", bei Tasten wie Return ausprobieren, ob KeyPress passt oder nicht.

Gruß Jürgen