質問

WinFormsでは、特定のコントロールにフォーカスを設定するために、 Control.Select() and Control.Focus()を使用して動作させます。

違いは何ですか、これは正しいアプローチですか?

役に立ちましたか?

解決

  

Focusは、主にカスタムコントロールの作成者を対象とした低レベルのメソッドです。代わりに、アプリケーションプログラマは、子コントロールにはSelectメソッドまたはActiveControlプロパティを、フォームにはActivateメソッドを使用する必要があります。

http://msdn.microsoft。 com / en-us / library / system.windows.forms.control.focus.aspx

他のヒント

Focus()は、実際にフォーカスを設定する低レベル関数です。

Select()は、より高いレベルのメソッドです。最初に、コンテナコントロールが見つかるまで、コントロールの親階層で上向きに繰り返し表示されます。次に、そのコンテナのActiveControlプロパティを(呼び出されたコントロールに)設定します。ただし、これらのメソッドのロジックは単純ではなく、UserControlコンテナーには特別な処理があります。

それらの違いの例として、Formsアプリのコントロールを開いたときにデフォルトのフォーカスに設定しようとすると、InitializeComponent()の後にコンストラクターで呼び出されたときにSelect()のみが機能します。 Focus()はしません。

このスレッドに追加したいのは、あるフォームから別のフォーム(新しく作成されたフォーム)に他のコントロールを移動するユーザーコントロールを記述するときです。元のフォームはコントロールを選択できなくなりましたが、フォーカスを使用して選択できました。これは、これらの方法が機能するレベルに関する答えを強調していると思います。しかし、それは、選択が元のフォームで期待どおりに機能しなくなったため、より高いレベルで選択を使用することを言うのが十分に簡単ではないことも意味します(別のフォームに配置する必要はありません-それを受け入れます)

Focus()は、状況によっては、コントロールを所有していないウィンドウにフォーカスがない場合にフォーカスを取得する可能性があります。 Select()は、ウィンドウでフォーカスを取得しません。

個人的な経験から、Windows ComboBoxを継承するユーザーコントロールを作成しました。 OnEnter イベントをオーバーライドするコードを作成する必要があり、その中に次のようなステートメントがありました

If Me.Focused Then ... Else ...

ただし、残念ながら予期しない結果が返されました。 (Load、Shown、またはActivatedイベントで) MyCustomerComboControl.Select を呼び出した場合、 OnEnter メソッドを呼び出しましたが、フォーカスがあった(つまり、FocusedがFalseだった)登録に失敗しましたFocusを呼び出した場合、動作しました。さらに、フォームが開いている場合、つまり別のコントロールを選択してから元のコントロールを再選択した場合、 Select は機能しました。したがって、私のシナリオ以外の状況では、上記のように Select を使用してください。

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