いつもありがとうございます。
今回は、c#.netのenable制御について、質問があります。
環境はVS2013です。
現在、
パネルコントロールにフォーカスがあると、
該当のボタンがクリック可能で
フォーカスが外れると、
該当のボタンがクリック不可という組み方をしています。
また、ファンクションキーで、ボタンのクリックと同等の機能を実装しています。
ただ、このやり方ですと、
パネルコントロールにフォーカスがある時にクリックできるはずボタンが、
クリックしようとしたときに、パネルコントロールからフォーカスが外れて、
該当のボタンがクリック不可能となってしまい、にっちもさっちもいかなくなっています。
この問題を解決したい場合、
最後のコントロールのフォーカスを調べる方法しか無いでしょうか?
LeaveやValidationのイベントで最後のフォーカスのコントロールを保持すると、
全てのコントロールに対して、それらの実装を行う必要があるので、
もし他に効率の良い方法があれば、ご教授頂けると助かります。
よろしくお願いします。
C#.netでのEnable制御について
Re: C#.netでのEnable制御について
赤が親のパネル
黄色が子のパネル
灰色がボタンで親のパネルに入っています。
子のパネルとボタンを同一グループ化して、
親パネルのEnterとLeaveイベントで、
ボタンのenable制御を行いました。
親パネルより上には、他に色々Textboxなどがありますが、
事実上、Form全体で子パネルにフォーカスがこないと、
該当するボタンが押下できない状態になりました。
というわけで、解決とさせて頂きます。ありがとうございました。
Re: C#.netでのEnable制御について
書いている間に解決となりましたが,構わず送信します。
フォーカスの有無でボタンを押せるかどうかを制御することを止めるのが一番の解決方法かと思います。
ボタンを押せるかどうかが決定するのは,本来はフォーカスの有無ではなく,別の理由ではないでしょうか。
「今どこにフォーカスがあたっているのか」というユーザー側の操作状況のみに依存した制御ではなく,
「有効な入力がなされているのか」というような,入力されたデータに依存する制御を行う方がよいでしょう。
一応,Windows ユーザーエクスペリエンスガイドライン (PDF) を確認してみました。
大抵のアプリケーションにおいて,コントロールが無効であるのは,
フォーカス移動という理由で無効化されることは通常ありえないためです。
フォーカスの有無でボタンを押せるかどうかを制御することを止めるのが一番の解決方法かと思います。
ボタンを押せるかどうかが決定するのは,本来はフォーカスの有無ではなく,別の理由ではないでしょうか。
「今どこにフォーカスがあたっているのか」というユーザー側の操作状況のみに依存した制御ではなく,
「有効な入力がなされているのか」というような,入力されたデータに依存する制御を行う方がよいでしょう。
一応,Windows ユーザーエクスペリエンスガイドライン (PDF) を確認してみました。
- 356ページ : メッセージ / エラー
混乱させることなく問題を防ぐことができるか。 該当する場合は、問題そのものを回避するようにします。たとえば、想定外の値を入力できるコントロールの使用は避け、有効な値の範囲しか受け付けない制約付きコントロールを使用すれば、エラー メッセージを表示する必要はありません。また、クリックすることによってエラーになるような場合は、コントロールを無効化します。コントロールが無効化されていても、その理由が明らかに伝わるのであれば、これも 1 つの方法です。
- 361ページ : メッセージ / エラー
コントロールやメニュー項目を無効にする。 無効化されている理由をユーザーが容易に推測できる場合は、コントロールやメニュー項目を無効にします
- 560ページ : ウィンドウ / ダイアログボックス
コンロトールの無効化または削除とエラー メッセージの表示
- コントロールが現在のコンテキストで適用されない場合は、次の方法を検討します。
- ユーザーが有効にできないコントロール、またはユーザーが使用することが想定されず、状態が頻繁に変化しないコントロールは削除します。 不要なコントロールを削除することで、簡潔なダイアログ ボックスになり、見落としがなくなります。コントロールの表示/非表示を頻繁に切り替えると、わずらわしくなります。
- ユーザーが使用することが想定され、状態が頻繁に変化するコントロールや、無効になっている理由をユーザーが簡単に推測できるコントロールは無効にします。 簡単に推測できる例としては、何らかの入力を求める空のテキスト ボックスが 1 つあるときにコミット ボタンが無効になっている場合が挙げられます。テキスト ボックスや編集可能なドロップダウン リストに関する重大ではないユーザー入力の問題を表示する場合は、バルーンを使用します。ただし、問題がバルーンで説明できない場合や、複数のコントロールに関連する場合は、簡単に推測できません。
- コントロールを有効にしたままで、使用方法を誤ったときにエラー メッセージを表示します。 この場合、コントロールが無効になっていると、無効になっている理由をユーザーが理解することが難しくなります。問題を特定するために、ユーザーは試行錯誤と論理的な推測を行うことになります。問題を明確に説明する、有用なエラー メッセージを表示するようにします。
- ヒント: コントロールを無効にするか、またはエラー メッセージを表示するかで迷った場合は、まず実際にエラー メッセージを作成してみてください。対象ユーザーが簡単に思い付かないような役立つ情報がエラー メッセージに含まれている場合は、コントロールを有効にしたままで、エラーを表示するようにします。その他の場合は、コントロールを無効にします。
- コントロールを無効にした場合は、関連するすべてのコントロールも無効にします。 たとえば、ラベル、補足説明、コマンドボタンがあります。ただし、グループ ボックス、グループ ラベル、グループの説明がある場合、それらのコントロールは無効にしません。
- コントロールが現在のコンテキストで適用されない場合は、次の方法を検討します。
大抵のアプリケーションにおいて,コントロールが無効であるのは,
- 必須項目の入力不足 (必須項目の前に * をつける等が推奨されている)
- 入力データの不整合 (IDataErrorInfoを経由し,WinFormsならErrorProviderで表示する)
- 外部条件の不足 (ネットワーク接続必須なのに未接続など)
- 何らかの処理中 (プログレスバーが表示されているような状態)
フォーカス移動という理由で無効化されることは通常ありえないためです。
オフトピック
ちなみに,このUXガイドラインはWindows 7時代のものですが,Windows 8以降用の日本語の文書でデスクトップ向けが見つからない (StoreApps向けは存在します)ので古いですが参照しています。