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

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

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

Re[3]: CheckedChangedイベントからのモーダル表示


(過去ログ 101 を表示中)

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

■60102 / inTopicNo.1)  CheckedChangedイベントからのモーダル表示
  
□投稿者/ ひっそり。。。 (4回)-(2011/06/20(Mon) 22:20:55)

分類:[C#] 

C#のvs2008で開発しています。

チェックボックスがあり、チェックがつくとモーダルダイアログを表示し、
表示されたダイアログでDialogResult.Cancelが返ってきた場合は、チェック
を外すようにしたいのですが、どういったやり方をするとよいのでしょうか?

以下のような形にすると無限ループ状態になってしまいました。。。
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    if (f2.ShowDialog(this) != DialogResult.OK)
    {
        checkBox1.Checked = !checkBox1.Checked;
    }
}

引用返信 編集キー/
■60103 / inTopicNo.2)  Re[1]: CheckedChangedイベントからのモーダル表示
□投稿者/ 魔界の仮面弁士 (2230回)-(2011/06/20(Mon) 22:43:31)
No60102 (ひっそり。。。 さん) に返信
> チェックボックスがあり、チェックがつくとモーダルダイアログを表示し、
モーダルフォームは Dispose せねばなりません。using で囲ってください。

> 表示されたダイアログでDialogResult.Cancelが返ってきた場合は、チェック
> を外すようにしたいのですが、どういったやり方をするとよいのでしょうか?

案1)
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
 checkBox1.CheckedChanged -= checkBox1_CheckedChanged;
 using(Form2 f2 = new Form2())
 {
  if (f2.ShowDialog(this) != DialogResult.OK)
  {
   checkBox1.Checked = !checkBox1.Checked;
  }
}
 checkBox1.CheckedChanged += checkBox1_CheckedChanged;
}


案2)
private bool 処理中 = false;
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
 if(処理中) return;
 処理中 = true;
 using(Form2 f2 = new Form2())
 {
  if (f2.ShowDialog(this) != DialogResult.OK)
  {
   checkBox1.Checked = !checkBox1.Checked;
  }
}
 処理中 = false;
}
引用返信 編集キー/
■60105 / inTopicNo.3)  Re[2]: CheckedChangedイベントからのモーダル表示
□投稿者/ 逆運の覇者 (4回)-(2011/06/20(Mon) 23:02:01)
魔界の仮面弁士さんが回答を書いていますが、
より単純なコードを書いておきます。


private void checkBox1_CheckedChanged(object sender, EventArgs e)
というイベントは、checkBox1のチェックがついたり、はずされたりすると動きます。
モーダルフォームがキャンセルされたとき、checkBox1のチェックは変わりますから、
またそのイベントが起きる、無限ループというわけです。

なので、チェックがはずされたときには何もしないようにします。


private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    //チェックがついた
    if (checkBox1.Checked)
    {
        Form2 f2 = new Form2();
        if (f2.ShowDialog(this) != DialogResult.OK)
        {
            checkBox1.Checked = false;
        }
    }
    //チェックが外されたので何もしない
    else return;
}

引用返信 編集キー/
■60106 / inTopicNo.4)  Re[1]: CheckedChangedイベントからのモーダル表示
□投稿者/ shu (793回)-(2011/06/20(Mon) 23:27:40)
No60102 (ひっそり。。。 さん) に返信

> 表示されたダイアログでDialogResult.Cancelが返ってきた場合は、チェック

> if (f2.ShowDialog(this) != DialogResult.OK)
(f2.ShowDialog(this) == DialogResult.Cancel)
とするのがより正しいかと思います。DialogResultはOKとCancelだけではありません。
そういう作りなら動作は正しいでしょうが、仕様がDialogResultがCancelだった場合はと
なっているのにあえて!=OKとする必要はないと思います。


今回の件では逆運の覇者さんの修正+Usingで十分かと思いますが、CheckedChanged内で
Checkedを変更するときは魔界の仮面弁士さんの言うようにイベントを一時的にはずしたり
private変数で処理中の状態をみてイベントを処理しないようにするというのがけっこう必要だったりします。
引用返信 編集キー/
■60117 / inTopicNo.5)  Re[2]: CheckedChangedイベントからのモーダル表示
□投稿者/ todo (151回)-(2011/06/21(Tue) 12:22:23)
CheckBox.CheckedChangedイベントのかわりにCheckBox.Clickイベントがお勧め。
違いは、コードから値を変更してもイベントが発生しない。
引用返信 編集キー/
■60206 / inTopicNo.6)  Re[3]: CheckedChangedイベントからのモーダル表示
□投稿者/ ひっそり。。。 (6回)-(2011/06/23(Thu) 00:48:40)
返信ありがとうございます。

解決できました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -