C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ユーザーコントロールのフォーカス制御


(過去ログ 112 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■66308 / inTopicNo.1)  ユーザーコントロールのフォーカス制御
  
□投稿者/ あいうえお (1回)-(2013/04/13(Sat) 23:49:41)

分類:[.NET 全般] 

ユーザーコントロールのフォーカスの制御について困っています。

日付を入力するテキストボックスが2つあるユーザーコントロールを作っています。
ユーザーコントロールからフォーカスが離れようとした時に
日付の大小チェックを行い、入力エラーの場合、
開始日付テキストボックスにフォーカスを設定して、
ユーザーコントロールからフォーカスが出れないようにしたいです。
※ユーザーコントロール内でのフォーカスの移動は可能。

フォームにこのユーザーコントロールと他のコントロールを貼り、
大小チェックエラーで、ユーザーコントロールにフォーカスがある状態で
他のコントロールをマウスでクリックし、
ユーザーコントロールからフォーカスがでれないかを試したところ、
タブ・チェックボックス・ラジオボタン・コマンドボタンをクリックした時は、
ユーザーコントロールからフォーカスが出れてしまいます。
テキストボックス・コンボボックスをクリックした時は
ユーザーコントロールからフォーカスは出れません。

なぜ、クリックするコントロールによって動きが違うのでしょうか。。。
フォーカスが出れないようにすることは可能でしょうか?

以下が、今書いているイベントです。
ユーザーコントロールのOnValidatedイベントをoverrideしています。
protected override void OnValidated(EventArgs e)
{
base.OnValidated(e);
if (大小チェックエラーの場合)
{
// 開始時間にフォーカスを設定
txtFrom.Focus();
}
}
引用返信 編集キー/
■66309 / inTopicNo.2)  Re[1]: ユーザーコントロールのフォーカス制御
□投稿者/ あいうえお (2回)-(2013/04/13(Sat) 23:58:46)
すみません。
書き忘れていましたが、
使用言語はC#(Visual Studio2008)になります。

よろしくお願いします。
引用返信 編集キー/
■66311 / inTopicNo.3)  Re[2]: ユーザーコントロールのフォーカス制御
□投稿者/ じゃんぬねっと (12回)-(2013/04/14(Sun) 22:15:40)
じゃんぬねっと さんの Web サイト
No66309 (あいうえお さん) に返信
> // 開始時間にフォーカスを設定
> txtFrom.Focus();

簡潔に書きます。

Validate 関連でフォーカスの制御をしようとしないでください。
txtFrom.Focus のようなコードは保障されません。
Validate で可能なフォーカス制御できるのは Cancel = true によるキャンセルのみです。

# コンテナの具合によっては、正しく動かない場合もありますが。
引用返信 編集キー/
■66322 / inTopicNo.4)  Re[3]: ユーザーコントロールのフォーカス制御
□投稿者/ あいうえお (3回)-(2013/04/15(Mon) 22:12:00)
No66311 (じゃんぬねっと さん) に返信

イベントをOnValidatingに変えて、
チェックエラーの時は、処理をキャンセルしたら、
どのコントロールもクリックできないようになりました。
ありがとうございます。

ただ、終了日付に開始日付よりも過去の日付を入力し、
ユーザーコントロールからフォーカスを遷移しようとした時に
フォーカスを開始日付にセットするという動きができません。
(処理をキャンセルするだけなので、フォーカスは終了日付にある状態)

msdnライブラリを見るとValidatingイベントでも
Focusメソッドなどでフォーカスの制御をしてはいけないようですし、
そもそも、入力後に大小チェックを行って、
下記の動きを全て満たそうとすることに無理があるんですかね・・・(^^;
 @ユーザーコントロールからフォーカスを遷移させない
 Aでも、ユーザーコントロール内でのフォーカスの遷移は可能
 B大小チェックエラー時は必ず開始日付にフォーカスをセット
引用返信 編集キー/
■66323 / inTopicNo.5)  Re[4]: ユーザーコントロールのフォーカス制御
□投稿者/ shu (278回)-(2013/04/15(Mon) 23:22:33)
No66322 (あいうえお さん) に返信

ユーザーコントロール上の全コントロールに対し
CausesValidation=False
にしておくとか。
引用返信 編集キー/
■66326 / inTopicNo.6)  Re[5]: ユーザーコントロールのフォーカス制御
□投稿者/ あいうえお (4回)-(2013/04/16(Tue) 08:18:33)
No66323 (shu さん) に返信

ありがとうございます。

じゃんぬねっとさん、shuさんに教えていただいた内容を
下記の通り、反映してみました。
※チェック処理は各テキストボックスの入力時に行うのではなく
 ユーザーコントロールからフォーカスが離れようとした時に行っています。

今は上記の@とAの動きはできるようになっているのですが、
やはりBの「大小チェックエラー時は必ず開始日付にフォーカスをセット」だけ、
上手くできません。

CausesValidationの使い方、合ってますかね(^^;

protected override void OnValidating(CancelEventArgs e)
{
    base.OnValidating(e);

    if (チェックエラーの場合)
    {
        this.txtFrom.CausesValidation = false;
        this.txtTo.CausesValidation = false;

        e.Cancel = true;
    }
}

protected override void OnValidated(EventArgs e)
{
    base.OnValidated(e);

    this.txtFrom.CausesValidation = true;
    this.txtTo.CausesValidation = true;
}

引用返信 編集キー/
■66328 / inTopicNo.7)  Re[6]: ユーザーコントロールのフォーカス制御
□投稿者/ shu (279回)-(2013/04/16(Tue) 09:29:59)
No66326 (あいうえお さん) に返信
> ■No66323 (shu さん) に返信

しておくというのは一時的に変更するということではなく
デザイナで設定するなどしてずっとFalseのままにしておくということです。
Validating時に変更しても遅いのです。その時点ではCausesValidationがTrueであるため
テキストボックスはCancelによりフォーカスを戻される対象となってしまいます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -