先週の土曜に「作って覚えるVisualC#」という本を購入してWindowsフォームアプリケーションの勉強を始めました。
本の内容を一通り終えたので自分で作っているものがあるのですが、フォームクローズ時に押されたボタンの判別方法が分からなくて詰まっています。
本では下記のURLのようにDialogResultを使って判別しているようなのですが、
今作っているものではボタンの数が多く、OK,Cancelなどで表現できる内容でもないので少しこの方法を使うことに抵抗があります。
これ以外の方法はありますでしょうか。
http://itnandemolab.blog70.fc2.com/blog-entry-1315.html
フォームアプリケーションのボタン判別について
Re: フォームアプリケーションのボタン判別について
基本的に,DialogResultはオプションダイアログボックスなどで使うのに最適な解です。
つまり,[OK][キャンセル]を持ち,この2つだけがダイアログボックスを閉じる手段である場合です。
# システムメニューの[閉じる]は[キャンセル]と同等の扱い。右上のxも同じ。
その場合でも,オプションデータ自体は別途受け渡しが必要になります。
上記以外の場合では,Formに終了状態のプロパティを用意し,DialogResult.OKを設定して閉じる,というのが簡単な方法だと思います。
UsePattern1, UsePattern2, UsePattern3, Cancelという4つのボタンがあって,それぞれClickイベントがデフォルト名のハンドラに結びついている前提です。で,上記のようなFormを,
のように使います。
他にも,最初にオブジェクトを渡しておいてそのオブジェクトに値を設定しても良いです。
# オプションダイアログだとこの方法になるかと。
つまり,[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();
}
}
using (var form = new Form2())
{
if (form.ShowDialog() != DialogResult.OK)
{
return;
}
switch (form.State)
{
case FinishState.UsePattern1:
// UsePattern1用のコード
/* ... */
}
}
他にも,最初にオブジェクトを渡しておいてそのオブジェクトに値を設定しても良いです。
# オプションダイアログだとこの方法になるかと。
Re: フォームアプリケーションのボタン判別について
とてもわかりやすいコードで、無事解決しました。
まだC#は始めたばかりなので、これから色々勉強しなければなりませんね。
今作っているものは完成したらこちらのお披露目掲示板で公開させて頂くつもりです。
ありがとうございました!
まだC#は始めたばかりなので、これから色々勉強しなければなりませんね。
今作っているものは完成したらこちらのお披露目掲示板で公開させて頂くつもりです。
ありがとうございました!