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

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

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

Re[5]: Validating で戻すフォーカスの制御は出来ませんか?


(過去ログ 10 を表示中)

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

■2276 / inTopicNo.1)  Validating で戻すフォーカスの制御は出来ませんか?
  
□投稿者/ M.K (14回)-(2007/03/29(Thu) 20:23:18)

分類:[C# (Windows)] 

何時もお世話になっております、M.Kと申します。

開発環境は WinXP SP2 + VS2005 + C# です。

今回はValidatingイベントについて質問があります。

Panelの上にTextBoxを横一列に3つ配置した状態で、PanelのValidatingイベントに下記
の様に3つのTextBoxの値が空白だったらe.Cancel = trueを設定する様にしています。


private void panel1_Validating(object sender, CancelEventArgs e)
{
    bool value = false;
    
    if ((!value) && (this.textBox1.Text == ""))
    {
        value = true;
    }

    if ((!value) && (this.textBox2.Text == ""))
    {
        value = true;
    }

    if ((!value) && (this.textBox3.Text == ""))
    {
        value = true;
    }

    if (value)
    {
        MessageBox.Show("どれか未入力です");
    }

    e.Cancel = value;
}


そしてtextbox2〜3にフォーカスがある状態で本イベントが発生し、e.Cancel=trueと
なった時に、通常であればtextbox2又は3にフォーカスが戻る(移動しない)事になりま
すが、これを常にtextbox1に戻したいと言う事は出来るのでしょうか?

引用返信 編集キー/
■2280 / inTopicNo.2)  Re[1]: Validating で戻すフォーカスの制御は出来ませんか?
□投稿者/ 刈歩 菜良 (39回)-(2007/03/29(Thu) 22:52:38)
刈歩 菜良 さんの Web サイト
M.Kさん

//e.Cancel = value;
textBox1.Focus();

で、どうでしょうか?


でも、私なら各テキストボックスに同じValidatingイベントハンドラ割り当てます。

private void textBox123_Validating(object sender, CancelEventArgs e)
{
    if (((TextBox)sender).Text == "")
    {
        MessageBox.Show("未入力です");
        e.Cancel = true;
    }
}

引用返信 編集キー/
■2281 / inTopicNo.3)  Re[2]: Validating で戻すフォーカスの制御は出来ませんか?
□投稿者/ 未記入 (56回)-(2007/03/29(Thu) 23:00:30)
No2280 (刈歩 菜良 さん) に返信
> //e.Cancel = value;
> textBox1.Focus();
>
> で、どうでしょうか?

ダメです。
ValidatingでFocusを設定すると予期せぬ事態を招きます。
よくあるのが、MessageBox無限ループとか。

Validatingでは一旦フォーカス遷移をキャンセルし、Validated以降でフォーカスを設定しましょう。
引用返信 編集キー/
■2282 / inTopicNo.4)  Re[3]: Validating で戻すフォーカスの制御は出来ませんか?
□投稿者/ 刈歩 菜良 (40回)-(2007/03/30(Fri) 00:49:48)
刈歩 菜良 さんの Web サイト
No2281 (未記入 さん) に返信
> ■No2280 (刈歩 菜良 さん) に返信
>>//e.Cancel = value;
>>textBox1.Focus();
>>
>>で、どうでしょうか?
>
> ダメです。
> ValidatingでFocusを設定すると予期せぬ事態を招きます。
> よくあるのが、MessageBox無限ループとか。
おぉ、そうだったんですね。
自分の環境で確認した時は問題なかったので、へっちゃらかと思っていました。
勉強になります。
引用返信 編集キー/
■2293 / inTopicNo.5)  Re[4]: Validating で戻すフォーカスの制御は出来ませんか?
□投稿者/ M.K (15回)-(2007/03/30(Fri) 11:33:38)
No2280 (刈歩 菜良 さん) に返信

> でも、私なら各テキストボックスに同じValidatingイベントハンドラ割り当てます。

チェックしたい内容は単純に3つのテキストボックスが空白かどうかではなくて、
例えば年・月・日と言った全ての要素が合わさって初めてチェックできるような
物になります。

なので一括してチェックするためにも一度テキストボックスをパネルに配置して、
パネルのValidatingイベントでチェックしようと思っている次第です。


■No2281 (未記入 さん) に返信

> Validatingでは一旦フォーカス遷移をキャンセルし、Validated以降でフォーカスを設定しましょう。

Validatingイベントでe.Cancel=trueとし、フォーカス遷移をキャンセルするとValidated
イベントが発生しません。

この場合の「Validated以降で」とは具体的にどのイベントを指しているのか教えて
頂けませんでしょうか?

引き続き宜しくお願いします。

引用返信 編集キー/
■2296 / inTopicNo.6)  Re[5]: Validating で戻すフォーカスの制御は出来ませんか?
□投稿者/ まどか (296回)-(2007/03/30(Fri) 12:15:34)
> チェックしたい内容は単純に3つのテキストボックスが空白かどうかではなくて、
> 例えば年・月・日と言った全ての要素が合わさって初めてチェックできるような
> 物になります。

チェック処理を外出しにしてそれぞれのテキストのValidatingから呼び出せばよいのでは。

> この場合の「Validated以降で」とは具体的にどのイベントを指しているのか教えて
> 頂けませんでしょうか?

Validatingがフォーカスの制御をおこなっているので、横槍を入れるな、ということでしょう。
したがって、関連して発生する一連のフォーカス系イベントではFocusをしないのがよいと思います。
Validatingを使用することはフォーカスの制御を依頼している目的もありますから。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -