Kampf um den Focus

22/09/2009 - 12:19 von Julia M | Report spam
Hi,

Dieses Problemchen ist sowohl in Winforms als auch WPF reproduzierbar.
In WinForms nehme man 1 Button, 2 CheckBoxen und 2 TextBoxen, ordne
sie so an:

[checkbox1] [textbox1]
[checkbox2] [textbox2]
[button]

und kopiere folgenden Code

public Form1() {
InitializeComponent();
textBox1.KeyUp += new KeyEventHandler(textBox1_KeyUp);
textBox2.KeyUp += new KeyEventHandler(textBox2_KeyUp);
}
void textBox1_KeyUp(object sender, KeyEventArgs e) {
if (e.KeyCode != Keys.Enter) return;
textBox2.Focus();
}
void textBox2_KeyUp(object sender, KeyEventArgs e) {
if (e.KeyCode != Keys.Enter) return;
button1.Focus();
}
private void button1_Click(object sender, EventArgs e) {
textBox1.Focus();
}

Alsdann klicke man màusisch auf den button und der Focus springt in
TextBox1 - wunderbar.
Ein Druck auf Enter bringt einen zu TextBox2 und von da aus auf
dieselbe Weise zurück zum Button.

Nun drücke man auch hier auf Enter, um den Button auszulösen ... und
der Focus springt in TextBox2 - Mist!

Ziel der Übung ist es, zwecks benutzerfreundlicherer Eingabe, mit der
Entertaste einige Controls (z.B. hier die CheckBox) zu überspringen,
da diese nur dazu dienen anfàngliche Einstellungen vorzunehmen, die
bei allen weiteren Eingaben bestehenbleiben und es vom Arbeitsablauf
her unsinnig wàre, sie jedesmal anzuspringen.

In VB6 hat dies immer wunderbar funktioniert - nur .net bzw WPF
scheint den Druck auf die Entertaste mit Aktivierung des Buttons nicht
zu "vergessen" und löst noch einmal zusàtzlich KeyUp in TextBox1 aus,
sobald sie den Focus erhàlt und damit sofort an TextBox2 durchreicht.
Wie stelle ich diesen Unsinn ab?
e.Handled fühlt sich anscheinend nicht zustàndig :-(

Danke
 

Lesen sie die antworten

#1 Ulf [Kado] Kadner
22/09/2009 - 13:53 | Warnen spam
Hallo Julia M! Du schriebst folgendes:

Alsdann klicke man màusisch auf den button und der Focus springt in
TextBox1 - wunderbar.
Ein Druck auf Enter bringt einen zu TextBox2 und von da aus auf
dieselbe Weise zurück zum Button.

Nun drücke man auch hier auf Enter, um den Button auszulösen ... und
der Focus springt in TextBox2 - Mist!



Und wenn Du mal Enter gedrückt hàlst wàrend die Schaltflàche den Fokus
hat wirst Du feststellen das der Fokus zu Textfeld 1 spring und erst
beim Loslassen zu textbox 2 hüpft.

Möglichweweise schaffst Du es jetzt bereits von allein herauszufinden wo
Dein Problem liegt.

Wenn nicht:
Du hast das unpassendste Ereignis gebunden. Besser:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if ((int)e.KeyChar != 13) textBox2.Focus();
}

und natürlich auch für textBox2

MfG, Ulf

Ähnliche fragen