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

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

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

Re[3]: イベントの前後に処理をいれたい


(過去ログ 112 を表示中)

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

■66471 / inTopicNo.1)  イベントの前後に処理をいれたい
  
□投稿者/ poppo (1回)-(2013/04/25(Thu) 20:29:50)

分類:[C#] 

フォームを開発していると以下のようなコードになることがよくありますが
皆さんならどのように解決するでしょうか。


private void button1_Click(object sender, EventArgs e)
{
if (Validate())
{
MessageBox.Show("検査エラーです。");
return;
}
try
{
// 何らかの処理
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void button2_Click(object sender, EventArgs e)
{
if (Validate())
{
MessageBox.Show("検査エラーです。");
return;
}
try
{
// 何らかの処理
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (Validate())
{
MessageBox.Show("検査エラーです。");
return;
}
try
{
// 何らかの処理
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private bool Validate()
{
// 検査処理
return false;
}
引用返信 編集キー/
■66473 / inTopicNo.2)  Re[1]: イベントの前後に処理をいれたい
□投稿者/ shu (295回)-(2013/04/25(Thu) 21:47:30)
No66471 (poppo さん) に返信
> if (Validate())
> {
> MessageBox.Show("検査エラーです。");
> return;
> }
> try
> {
> // 何らかの処理
> }
> catch (Exception ex)
> {
> MessageBox.Show(ex.Message);
> }
これがすべて同じ記述ならそれを1つのメソッド化してそれを呼ぶようにすれば
いいんじゃないでしょうか。

意図している内容がいまひとつわかりません。
引用返信 編集キー/
■66474 / inTopicNo.3)  Re[2]: イベントの前後に処理をいれたい
□投稿者/ poppo (3回)-(2013/04/25(Thu) 22:08:56)
>意図している内容がいまひとつわかりません。
説明足らず申し訳ないです。

イベント発生

フォームの入力内容の検査 -> 検査エラーの場合はメッセージを表示して終了

何らかの処理 -> Exceptionが発生した場合はメッセージを表示して終了
何らかの処理はイベント毎に違います。

終了


検査の部分は検査するイベントは少ないのでまだ大丈夫ですが

多くのイベント内でException発生に備えてtry catchしなければならないかと思います。
button1_Clickを例にしますと
private void button1_Click(object sender, EventArgs e)
{
// 何らかの処理
}
これで提示した処理とまったく同じ処理が可能であればベストです。
つまり提示したコードの
if (Validate())
{
MessageBox.Show("検査エラーです。");
return;
}
try
{

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
この部分をどうにか省略できないかと思ってます。

このようなケースは皆さんないでしょうか。
引用返信 編集キー/
■66475 / inTopicNo.4)  Re[3]: イベントの前後に処理をいれたい
□投稿者/ Azulean (148回)-(2013/04/25(Thu) 23:00:28)
2013/04/25(Thu) 23:34:29 編集(投稿者)
ボタンごとに異なるデリゲートを渡す関数を作っててやればいいでしょう。


private void button1_Click(object sender, EventArgs e)
{
    TryActionWithValidation(() => { MessageBox.Show("Button1です。"); });
}

private void button2_Click(object sender, EventArgs e)
{
    TryActionWithValidation(Hello);
}

private void Hello()
{
    MessageBox.Show("Hello!");
}

private void TryActionWithValidation(Action action)
{
    if (Validate())
    {
        MessageBox.Show("検査エラーです。");
        return;
    }
    try
    {
        action();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

引用返信 編集キー/
■66476 / inTopicNo.5)  Re[3]: イベントの前後に処理をいれたい
□投稿者/ shu (296回)-(2013/04/26(Fri) 08:46:22)
No66474 (poppo さん) に返信
>> 何らかの処理はイベント毎に違います。
イベント毎に処理が違うなら今の書き方にしておくのがよいかと思います。
try-Catchブロック構造をメソッド化するだけのことと対して変わらないので
呼出階層が増えるだけでDebug時のトレースが複雑になってしまいます。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -