フォームアプリケーションのボタン判別について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
ぱにしん
記事: 58
登録日時: 14年前
住所: 滋賀

フォームアプリケーションのボタン判別について

#1

投稿記事 by ぱにしん » 14年前

先週の土曜に「作って覚えるVisualC#」という本を購入してWindowsフォームアプリケーションの勉強を始めました。
本の内容を一通り終えたので自分で作っているものがあるのですが、フォームクローズ時に押されたボタンの判別方法が分からなくて詰まっています。

本では下記のURLのようにDialogResultを使って判別しているようなのですが、
今作っているものではボタンの数が多く、OK,Cancelなどで表現できる内容でもないので少しこの方法を使うことに抵抗があります。
これ以外の方法はありますでしょうか。
http://itnandemolab.blog70.fc2.com/blog-entry-1315.html

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: フォームアプリケーションのボタン判別について

#2

投稿記事 by YuO » 14年前

基本的に,DialogResultはオプションダイアログボックスなどで使うのに最適な解です。
つまり,[OK][キャンセル]を持ち,この2つだけがダイアログボックスを閉じる手段である場合です。
# システムメニューの[閉じる]は[キャンセル]と同等の扱い。右上のxも同じ。
その場合でも,オプションデータ自体は別途受け渡しが必要になります。

上記以外の場合では,Formに終了状態のプロパティを用意し,DialogResult.OKを設定して閉じる,というのが簡単な方法だと思います。

コード:

public enum FinishState
{
    NotFinished,
    UsePattern1,
    UsePattern2,
    UsePattern3,
}

public class Form2 : Form
{
    public FinishState State { get; private set; }

    public Form2 () { /* ... */ } // 省略

    private void UsePatternButtonClicked (FinishState state)
    {
        State = state;
        DialogResult = DialogResult.OK;
        Close();
    }

    private void UsePattern1_Click (object sender, EventArgs e)
    {
        UsePatternButtonClicked(FinishState.UsePattern1);
    }

    private void UsePattern2_Click (object sender, EventArgs e)
    {
        UsePatternButtonClicked(FinishState.UsePattern2);
    }

    private void UsePattern3_Click (object sender, EventArgs e)
    {
        UsePatternButtonClicked(FinishState.UsePattern3);
    }

    private void Cancel_Click (object sender, EventArgs e)
    {
        DialogResult = DialogResult.Cancel;
        Close();
    }
}
UsePattern1, UsePattern2, UsePattern3, Cancelという4つのボタンがあって,それぞれClickイベントがデフォルト名のハンドラに結びついている前提です。で,上記のようなFormを,

コード:

using (var form = new Form2())
{
    if (form.ShowDialog() != DialogResult.OK)
    {
        return;
    }
    switch (form.State)
    {
    case FinishState.UsePattern1:
        // UsePattern1用のコード
    /* ... */
    }
}
のように使います。

他にも,最初にオブジェクトを渡しておいてそのオブジェクトに値を設定しても良いです。
# オプションダイアログだとこの方法になるかと。

アバター
ぱにしん
記事: 58
登録日時: 14年前
住所: 滋賀

Re: フォームアプリケーションのボタン判別について

#3

投稿記事 by ぱにしん » 14年前

とてもわかりやすいコードで、無事解決しました。
まだC#は始めたばかりなので、これから色々勉強しなければなりませんね。
今作っているものは完成したらこちらのお披露目掲示板で公開させて頂くつもりです。

ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る