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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.66471 の関連記事表示

<< 0 >>
■66471  イベントの前後に処理をいれたい
□投稿者/ poppo -(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;
    }
親記事 /過去ログ112より / 関連記事表示
削除チェック/

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

    意図している内容がいまひとつわかりません。
記事No.66471 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66474  Re[2]: イベントの前後に処理をいれたい
□投稿者/ poppo -(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);
    }
    この部分をどうにか省略できないかと思ってます。

    このようなケースは皆さんないでしょうか。
記事No.66471 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66475  Re[3]: イベントの前後に処理をいれたい
□投稿者/ Azulean -(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);
    }
    }
記事No.66471 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66476  Re[3]: イベントの前後に処理をいれたい
□投稿者/ shu -(2013/04/26(Fri) 08:46:22)
    No66474 (poppo さん) に返信
    >> 何らかの処理はイベント毎に違います。
    イベント毎に処理が違うなら今の書き方にしておくのがよいかと思います。
    try-Catchブロック構造をメソッド化するだけのことと対して変わらないので
    呼出階層が増えるだけでDebug時のトレースが複雑になってしまいます。
記事No.66471 のレス /過去ログ112より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -