5

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

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

4

5 に答える 5

3

原則として、TABキーの標準的な動作をオーバーライドすることは悪い考えだと思います。たぶん、2番目のテキストボックスに有効なエントリが作成されるまで、3番目のテキストボックスを無効にするようなことを行うことができます。

さて、そうは言っても、お客様のご要望でこのルールも破りました。エンターキーをタブキーのように機能させ、エンターキーで値をテキストフィールドに保存し、カーソルを次のフィールドに進めます。

于 2008-08-16T20:55:29.483 に答える
1

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

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

于 2008-08-16T21:38:26.090 に答える
1

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

入力していただきありがとうございます!

于 2008-08-17T06:50:14.633 に答える
0

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

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

于 2008-08-16T22:02:07.150 に答える
0

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

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

ユーザーがユーザー名または電子メール アドレス (別のフィールド) とパスワードを入力できるログイン コントロールを使用して、これと同様のことを行いました。

于 2008-10-22T20:18:13.167 に答える