質問

3 つの TextBox で構成される UserControl があります。フォームには 1 つ以上の UserControl を含めることができます。独自のタブの動作を実装したいので、ユーザーが 2 番目の TextBox で Tab キーを押した場合、2 番目の TextBox に何か入力されている場合にのみ 3 番目の TextBox に移動する必要があります。2 番目の TextBox に何も入力されていない場合は、通常のタブの動作に従って、フォームの次のコントロールがフォーカスを取得する必要があります。ユーザーが最初または 2 番目の TextBox と [presses] タブに何も入力していない場合は、フォーム上のコントロールをスキップする必要があるという特殊なケースが発生します。

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

役に立ちましたか?

解決

一般的なルールとして、TAB キーの標準の動作をオーバーライドするのは悪い考えだと思います。おそらく、2 番目のテキスト ボックスに有効な入力が行われるまで 3 番目のテキスト ボックスを無効にするなどのことを行うことができます。

さて、そうは言っても、私はお客様の要望でこのルールを破ってしまいました。Enter キーを Tab キーと同様に機能させ、Enter キーでテキスト フィールドの値を保存し、カーソルを次のフィールドに進めます。

他のヒント

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

ロブ・トーマスが言ったように、個人的には 3 番目のテキストボックスを無効にします。ただし、これを実行する決意があれば、マニュアルを作成するのは難しくありません (以下を参照)。ハックっぽい)解決策。Tab キーを押したら (フォーカスが 2 番目のテキストボックスにある場合)、フォーム内に変数を設定します。次にフォーカスされたオブジェクトが 3 番目のテキストボックスであれば、それがどのように起こったかが正確にわかります。

この奇妙なタブの動作の理由は、すべて入力プロセスの速度にあります。入力を得ることができて本当に良かったです。テキストボックスを無効にすることは考えていませんでしたが、実際には機能する可能性があります。しかし、Enter キーを使用して入力を受け入れることは、私の頭にはありませんでした。そうすればもっとうまくいくでしょう。ユーザーは数値を入力し、Enter キーを押して入力を受け入れると、次に使用可能なテキスト ボックスがアクティブになります。ケーキを持って食べるようなものです。 Enter キーを使用するときは、正しいフィールドに移動するために不必要なタブ移動を行う必要がなく、数字キーボードの横にある Enter キーを使用すると非常にスムーズになるため、速度の要素が存在します。

ご意見ありがとうございます!

私もダニー・スマーフさんの意見に同意します。タブ オーダーをいじると、アプリケーションの要件が変更された場合に後で大変な目に遭う可能性があります。

もう 1 つの方法は、ユーザーが実行できる何らかのウィザードを実装することです。

コントロールを無効にするよりも、TabStop を試してみてください。これが false の場合、タブ移動時にコントロールが単純にスキップされます。

また、TextBox の Changed イベントを他のコントロールの TabStop を更新する場所にすることをお勧めします。

私はこれと似たようなことをログイン コントロールで実行しました。ユーザーはユーザー名または電子メール アドレス (別のフィールド) に加えてパスワードを入力でき、その作業を行うために tabStop を使用しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top