5


0

私は3つのTextBoxからなるUserControlを持っています。 フォーム上で、1つ以上のUserControlを持つことができます。 自分のタブの動作を実装したいので、2番目のTextBoxでユーザーがTabキーを押した場合、2番目のTextBoxに何も入力されていない場合は3番目のTextBoxに移動する必要があります。 2番目のTextBoxに何も入力されていない場合は、通常のタブの動作に従って、フォームの次のコントロールにフォーカスが移動します。 ユーザーが最初のTextBoxまたは2番目のTextBoxとプレスのタブに何も入力していない場合は、フォーム上のコントロールをスキップする必要があるという特別なケースがあります。

ProcessDialogKeyを使用することで、うまく動作させることができましたが、まだ1つ問題があります。 私の質問は、私のUserControlがTabまたはShift-Tabからフォーカスを得たかどうかを知りたいのですが、ユーザーがコントロールをクリックした場合にWinFormsコントロールがフォーカスを得た方法を検出する方法があるかどうかです。特別なことをしたくない。

5 Answer


3


一般的な規則として、TABキーの標準的な振る舞いを上書きするのは悪い考えです。 2番目のテキストボックスに有効な入力が行われるまで、3番目のテキストボックスを無効にするなどの操作を行うことができます。

_Now、これを言って、私はまた顧客の要求でこの規則を破った。 Enterキーはテキストフィールドに値を保存し、カーソルを次のフィールドに進めるというTabキーのようなEnterキー機能を作成しました。


1


私はあなたがそれをすることができる内蔵の方法があるとは思わない。 WinFormsのすべてのフォーカスイベント(GotFocus、LostFocus、Enter、Leave)は、空のEventArgsパラメータを使用して呼び出されます。これにより、追加の情報は得られません。

個人的には、Rob Thomasが言ったように、私は3番目のテキストボックスを無効にします。 しかし、これをやろうと決心しているのであれば、手動(read:hackish)ソリューションを設定するのは難しくありません。 タブキーが押されたら(2番目のテキストボックスにフォーカスがある場合)、フォーム内に変数を設定します。 次にフォーカスされているオブジェクトが3番目のテキストボックスであれば、それがどのように発生したのかを正確に把握できます。


1


この奇妙なタブの振る舞いの理由はすべて入力プロセスのスピードに関するものです。 テキストボックスを無効にすることは考えていませんでしたが、実際にはうまくいく可能性があります。 しかし、入力を受け入れるためにEnterキーを使用しても、私の考えを超えることはありませんでした。 それはとてもうまくいくでしょう。 ユーザーは番号を入力してからEnterを押して入力を確定すると、次に入力可能なテキストボックスがアクティブになります。 それはケーキを持って食べることのようなものです。スピードキーは、エンターキーを使うときに正しいフィールドにたどり着くために不必要なタブ付けをしなくてもよく、数字キーボードの隣のエンターキーを使うと本当にスムーズになるからです。

入力をありがとう!


0


私はDannySmurfに同意します。 アプリケーションの要件が変更された場合、タブの順序を変更すると後で問題が発生する可能性があります。

あなたがすることができるもう一つのことは、ユーザーが通過するためのある種のウィザードを実装することです。


0


コントロールを無効にするよりは、TabStopを使って試してみてください - これがfalseであれば、タブ操作時にコントロールは単にスキップされます。

私はまた、TextBoxのChangedイベントが他のコントロールのTabStopを更新する場所であることを提案したいと思います。

私はログインコントロールを使ってこれに似たことをしました。ユーザーはユーザー名かEメールアドレス(別々のフィールドに)とパスワードを入力することができ、tabStopは仕事を終わらせるために使用したものです。