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
> 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
Aber warum ist dasselbe nicht beim Wechsel von TextBox1 nach TextBox2
passiert?
Der Buttun verarbeitet das KeyUp nicht. Nach dem
Bet�tigen von <Enter> wenn der Button den Fokus hat wird Clicked
ausgel�st was daf�r sorgt das textbox1 den Focus bekommt.
Jetzt hat die Textbox den Fokus aber Du hast im selben Moment noch nicht
die <Enter> Taste losgelassen. Wenn Du diese Losl�st dann erst wenn
Textbox1 den Fokus hat was dann wiederum das KeyUp Ereignis der Textbox1
ausl�st.
MfG, Ulf
> Der Buttun verarbeitet das KeyUp nicht. Nach dem
> Bet�tigen von <Enter> wenn der Button den Fokus hat wird Clicked
> ausgel�st was daf�r sorgt das textbox1 den Focus bekommt.
>
> Jetzt hat die Textbox den Fokus aber Du hast im selben Moment noch nicht
> die <Enter> Taste losgelassen. Wenn Du diese Losl�st dann erst wenn
> Textbox1 den Fokus hat was dann wiederum das KeyUp Ereignis der Textbox1
> ausl�st.
Ich will hier nochwas anmerken. Das Verhalten was Du implementieren
willst wiederspricht dem vom Nutzer eigentlich gewohnten und erwarteten
UI-Verhalten!
Normalerweise wechselt man mit der <Tab> Taste zwischen Eingabefeldern.
Gerad wenn im Controlensemble der Form eine Schaltfl�che (oder mehrere)
enthalten ist, so erwarte ich das Bei einem Enter eine Schaltfl�che
bet�tigtwird, egal welches Control gerad den Fokus hat. So kenne ich es
von zahlreichen anderen Anwendungen und w�r sicher Entt�uscht wenn das
auf einmal in einer Anwendung anders w�r.
MfG, Ulf
> Ich will hier nochwas anmerken. Das Verhalten was Du implementieren
> willst wiederspricht dem vom Nutzer eigentlich gewohnten und erwarteten
> UI-Verhalten!
Glaub mir, Du wärest enttäuscht, _wenn_ es in dieser Anwendung - die
Du in ihrem vollen Umfang nicht kennst - so wäre.
Das würde Dich nämlich elendig Zeit kosten, ständig über Checkboxen
etc hinwegzutabben oder "blinde" Eingaben ins völlig falsche Control
zu setzen.
Wer "mittendrin" feststellt, daß er die Voreinstellungen ändern
möchte, benutzt eben die Tab-Taste, um doch zu einer - der jeweiligen
TextBox zugeordneten - Checkbox weitergeleitet zu werden.
Die Voreinstellung bestimmen übrigens u.a., ob ein eingetragener Wert
nach dem Abschicken aus dem Formular gelöscht wird oder nicht. Das
spart Zeit bei der Eingabe vieler ähnlicher Bezeichnungen.
Da außerdem so gut wie alle Felder Pflichteingaben sind, wäre es dazu
auch noch unsinnig, z.B. aus dem ersten Feld heraus einen Default-
Button zu betätigen.
_Diese_ Lösung paßt durchaus zu _diesem_ Problem.
> Glaub mir, Du w�rest entt�uscht, _wenn_ es in dieser Anwendung - die
> Du in ihrem vollen Umfang nicht kennst - so w�re.
Wenn Du es sagst... :-)
> Das w�rde Dich n�mlich elendig Zeit kosten, st�ndig �ber Checkboxen
> etc hinwegzutabben oder "blinde" Eingaben ins v�llig falsche Control
> zu setzen.
OK, aber dabit doktorst Du lediglich an den Symptomen die ein anderes
Problem erst verursacht. Ich bin hier der Meinung das Nutzerinterfaces
die so weit mit Elementen zu Nutzerinteraktion �berladen sind, das
derartige Dinge eine Rolle spielen k�nnen, einfach mal sehr ung�nstig
entworfen wurden.
Siehe dazu z.B.
[Richtlinien zur Entw. einer tastaturgesteuerten Benutzeroberfl�che]
http://msdn.microsoft.com/de-de/library/ms971323.aspx
> _Diese_ L�sung pa�t durchaus zu _diesem_ Problem.
Ja und hast Du denn auch meine Erkl�rung verstanden warum Dein Problem
mit dem Dir unerkl�rlichen Fokusverlust entstanden ist?
MfG, Ulf
Das Interface ist _nicht_ überladen - wäre mit einer Handvoll Check-
und Textboxen und einem Button auch wirklich schwer zu
bewerktstelligen. Es ist einfach nur für eine möglichst effektive
Dateneingabe (und wir reden hier von ein paar Dutzend Datensätzen am
Stück) optimiert, die sich in dieser Form im betreffenden Programm
seit Jahren bewährt hat.
> Ja und hast Du denn auch meine Erklärung verstanden warum Dein Problem
> mit dem Dir unerklärlichen Fokusverlust entstanden ist?
Ja.
> Das Interface ist _nicht_ �berladen - w�re mit einer Handvoll Check-
> und Textboxen und einem Button auch wirklich schwer zu
> bewerktstelligen.
OK. Mach was Du willst. Wenn der Wink mit dem Zaunspfahl nicht
funktioniert solls halt nicht sein! :-)
>> Ja und hast Du denn auch meine Erkl�rung verstanden warum Dein Problem
>> mit dem Dir unerkl�rlichen Fokusverlust entstanden ist?
>
> Ja.
OK, bitte.
MfG, Ulf
Fein. Treffen wir uns morgen um 6 hinter der Windmühle am See und
machen ein Eingabeduell. Die Waffen sind ja bereits festgelegt. Du an
der Tab-Morstetaste, ich an der Entertaste. Der Verlierer schneidet
dem Gewinner die Fußnägel. ;-)
> Fein. Treffen wir uns morgen um 6 hinter der Windm�hle am See und
So zeitig steh ich nicht freiwillig auf. Das w�r schon Strafe genug! :-D
> machen ein Eingabeduell. Die Waffen sind ja bereits festgelegt. Du an
> der Tab-Morstetaste, ich an der Entertaste.
Andersrum w�r wom�glich besser.
> Der Verlierer schneidet dem Gewinner die Fu�n�gel. ;-)
Was ist wenn ich nun nen Fu�fetisch hab und verlieren will? ;-)
MfG, Ulf
da es jetzt nicht mehr C# ist, w�re das vom fachlichen
jetzt hier nicht mehr der richtige Ort.
Danke f�r das Verst�ndnis.
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Dann ignoriere es doch einfach.
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>
> da es jetzt nicht mehr C# ist, w�re das vom fachlichen
> jetzt hier nicht mehr der richtige Ort.
Frank entspann Dich! Der Thead w�r ohne Dein Posting mind. um 3
OT-Postings �rmer.
MfG, Ulf
>> da es jetzt nicht mehr C# ist, w�re das vom fachlichen
>> jetzt hier nicht mehr der richtige Ort.
Danke.