3

以下のコードを使用して、テキスト フィールドにフォーカスを設定します。

public void setFieldInFocus(TabPage tabPage)
    {
        foreach (Control t in tabPage.Controls)
        {
            if (t is TextBox)
            {
                if (t.Name == fieldInFocus)
                {
                    t.Focus();              

                }
            }

        }

    }

カーソルはテキスト フィールドに表示されますが、モバイル キーパッドを使用してテキストを入力しようとすると、カーソルが既にテキスト フィールドにあるにもかかわらず、テキスト フィールドをクリックするまで何も起こりません。次に、テキスト フィールドをクリックし、モバイル キーパッドを使用してテキストを入力しようとすると、機能します。テキストを入力するためにテキスト フィールドをクリックしなければならないのはなぜですか? この問題を解決するにはどうすればよいですか?

コンパクト フレームワーク 3.5 と textField.Select(); を使用していることに注意してください。利用できません。

ありがとう

4

1 に答える 1

1

投稿したコード スニペットはいつ実行されますか? フォームが実際に表示される前ですか?その場合、.NET ランタイムは手動フォーカス設定をオーバーライドし、フォーム上の最初のフォーカス可能なコントロールに変更します。

カーソルがテキスト ボックス内に表示されても、フォーカスがあるのはコントロールではない場合があります。

理想的とは言えない解決策の 1 つは、フォームの読み込みイベントが発生したときに有効になる非常に短い間隔 (たとえば 10) でフォームにタイマーをドロップすることです。timer_tick ハンドラーで、タイマーを無効にして (1 回だけ実行されるようにする)、コード スニペットを実行します。この方法でコードを実行すると、フォーカス オーバーライド コードが実行される前に、Windows メッセージ ポンプがフォームを完全に読み込んで表示する機会が確保されます (そして、既定のフォーカス ルーチンを実行するプロセスで) 。

この問題を軽減するより良い方法は、テキスト ボックスが最初のフォーカス可能な項目になるようにフォームを設計することです。デフォルトでは、フォームはその子コントロール ツリーを深さ優先で反復し、フォーカス可能なコントロールを見つけると、そのコントロールにフォーカスして追い出します。

フォームのデザイナー コード ファイルを確認する場合は、手動で調整して、次のことを確認してください。

  1. テキスト ボックスは、タブ ページに追加された最初のコントロールです。
  2. タブページは、タブ コントロールに追加された最初のコントロールです。
  3. タブコントロールがフォームに追加された最初のコントロールであること。

これら 3 つの条件が満たされている場合、テキスト ボックスはデフォルトで最初にフォーカスされ、それをオーバーライドするために他のコードを実行する必要はありません。

お役に立てれば。

于 2012-04-24T19:38:03.983 に答える