2008-08-16 6 views
5

Ich habe ein UserControl, das aus drei TextBoxen besteht. Auf einem Formular kann ich ein oder mehrere oder mein Benutzersteuerelement haben. Ich möchte mein eigenes Tab-Verhalten implementieren. Wenn der Benutzer die Tabulatortaste in der zweiten TextBox drückt, sollte ich nur zur dritten TextBox wechseln, wenn die zweite TextBox etwas eingegeben hat. Wenn in der zweiten TextBox nichts eingegeben wird, sollte das nächste Steuerelement des Formulars den Fokus gemäß dem normalen Registerverhalten erhalten. Wenn der Benutzer nichts in die erste oder zweite TextBox und die Registerkarte "Drücken" eingegeben hat, gibt es diesen speziellen Fall, bei dem ein Steuerelement auf dem Formular übersprungen werden sollte.Override Registerkarte Verhalten in WinForms

Mit dem ProcessDialogKey habe ich es geschafft, funktioniert es irgendwie ok, aber ich habe immer noch ein Problem. Meine Frage ist, ob es einen Weg gibt zu erkennen, wie ein WinForms-Steuerelement den Fokus bekommen hat, da ich auch wissen möchte, ob mein UserControl den Fokus von einem Tab oder Shift-Tab hat und dann meine komischen Sachen macht, aber wenn der Benutzer das Steuerelement anklickt Ich möchte nichts Besonderes machen.

Antwort

3

Als allgemeine Regel würde ich sagen, das Überschreiben des Standardverhaltens des TAB-Schlüssels wäre eine schlechte Idee. Vielleicht können Sie etwas wie das Deaktivieren der 3. Textbox tun, bis ein gültiger Eintrag in der 2. Textbox gemacht wird.

Jetzt, nachdem ich dies gesagt habe, habe ich diese Regel auch auf Wunsch des Kunden gebrochen. Wir haben die Eingabetastenfunktion wie die Tabulatortaste ausgeführt, wobei die Eingabetaste den Wert in einem Textfeld speichern und den Cursor zum nächsten Feld bewegen würde.

1

Ich glaube nicht, dass es eine eingebaute Möglichkeit gibt, dass Sie es tun könnten. Alle WinForms-Fokusereignisse (GotFocus, LostFocus, Enter, Leave) werden mit leeren EventArgs-Parametern aufgerufen, die Ihnen keine zusätzlichen Informationen geben.

Persönlich würde ich die dritte Textbox deaktivieren, wie Rob Thomas sagte. Wenn Sie jedoch entschlossen sind, dies zu tun, wäre es nicht schwierig, eine manuelle (lese: hackish) Lösung zu erstellen. Sobald die Tabulatortaste gedrückt wird (wenn sich der Fokus auf dem zweiten Textfeld befindet), legen Sie eine Variable in Ihrem Formular fest. Wenn das nächste Objekt dann das dritte Textfeld ist, wissen Sie genau, wie es passiert ist.

0

Ich stimme DannySmurf zu. Wenn Sie sich an die Tab-Reihenfolge halten, können Sie später die Hölle ereilen, wenn sich die Anforderungen für die Anwendung ändern.

Eine andere Sache, die Sie tun könnten, ist eine Art von Assistenten für den Benutzer zu implementieren.

1

Der Grund für dieses ungewöhnliche Tab-Verhalten ist die Geschwindigkeit im Eingabeprozess. Es war wirklich gut, etwas Input zu bekommen, ich hatte nicht daran gedacht, eine Textbox zu deaktivieren, aber das könnte tatsächlich funktionieren. Aber mit der Enter-Taste, um die Eingabe zu akzeptieren, war mir nicht einmal in den Sinn gekommen. Das wird so viel besser funktionieren. Der Benutzer kann die Zahlen eingeben und dann die Eingabetaste drücken, um die Eingabe zu akzeptieren, und die nächste mögliche Textbox wird die aktive sein. Es ist so, als hätte man den Kuchen und isst ihn auch. Der Geschwindigkeitsfaktor ist da, da mit der Eingabetaste keine unnötige Tabulatoren gemacht werden müssen, um zum richtigen Feld zu gelangen und die Eingabetaste neben der numerischen Tastatur macht es glatt.

Danke für die Eingabe!

0

Besser als die Steuerelemente deaktivieren, versuchen Sie, mit TabStop herumzuspielen - wenn dies falsch ist, wird das Steuerelement beim Tabbing einfach übersprungen.

Ich würde auch vorschlagen, dass das Changed-Ereignis der TextBox der Ort ist, um TabStop auf den anderen Steuerelementen zu aktualisieren.

Ich habe etwas ähnliches mit einem Login-Steuerelement getan, wo Benutzer entweder einen Benutzernamen oder eine E-Mail-Adresse (in separaten Feldern), plus ihr Passwort eingeben konnte, und TabStop ist, was ich verwendet, um die Arbeit zu erledigen.