- PR -

複数Formを一気に閉じる

1
投稿者投稿内容
にゃんぎ
常連さん
会議室デビュー日: 2004/03/31
投稿数: 35
投稿日時: 2005-08-30 14:02
C#でのWindowsアプリ開発を久しぶりに始めたものです。

・MainForm 実行ボタン
・Form1〜3 戻る、次へ、キャンセルボタン
があります。

1.MainFormの実行ボタンを押すとForm1を開く
2.Form1の次へを押すと、Form1を非表示にしForm2を開く
3.Form2の次へを押すと、Form2を非表示にしForm3を開く
4.各戻るボタンを押すと一つ前のFormに戻る
5.キャンセルを押すと、どのFormを開いていてもMainFormに戻る

以上の仕様を実装しようと思っています。

現在実装した事
・次へ
MainForm>Form1>Form2・・・
とShowDialogで開き、this.Hide()で自Formを非表示にする。
・戻る
Form1〜3のArrayListを渡していき、自Formの前のFormをShowし、自FormをHide.
・キャンセル
Form1〜3のArrayListをループさせ、Close()を実行する

見た目は上記で実現できましたが、ArrayListを使ったりして力技な感がぬぐえません。
もっとスマートなやり方がないかと探しています。

こうやった方がいい等ありましたらご教授いただけませんでしょうか。
よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-30 14:19
キャンセルの時の処理が問題となっているのでしょうか?
自分で Form のインスタンスは変数に取っているが、
1 つ前の Form 内にだけインスタンスの参照を持っているので、
キャンセル時に困る... ということでしょうか?

で、それらを解決するために、ArrayList を使って管理しているのですよね?
ArrayList である必要はないですが、にゃんぎさんの仕様では似たような実装になると思います。

こちらは参考になりますでしょうか?
http://support.microsoft.com/default.aspx?scid=kb;ja;JP308537



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
にゃんぎ
常連さん
会議室デビュー日: 2004/03/31
投稿数: 35
投稿日時: 2005-08-30 14:59
>じゃんぬねっと様

返答ありがとうございます。

申し訳ありません、タイトルのつけ方が正しくありませんでした。

やはり、コレクションクラス(私はArraylistでやりましたが)を各Formに渡していってキャンセル時は一気にCloseすると言うやり方になるのですね。(Disposeに変えました)


もう一つ考えたのが、MainFormから直接Form1を呼ぶのではなく、中間に管理Classをかませるというものです。

Form1>Form2・・とするのではなく
中間Class>Form1>中間Class>Form2・・・
実現できるかどうかは試していませんが、間にひとつClassを挟むので遅くなったりしないかと最初の方を選びました。

こういった場合はこうしたほうがいい等あれば引き続きよろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-30 15:07
引用:

やはり、コレクションクラス(私はArraylistでやりましたが)を、
各Formに渡していってキャンセル時は一気にCloseすると言うやり方になるのですね。


とりあえず、今の仕様だとそうなりません?

引用:

中間Class>Form1>中間Class>Form2・・・


私としてはその方が複雑に感じてしまいます...
現状の方法で、何が不満であるかを教えて頂けませんか?

# そういえば、以前に、次の Form のインスタンスを前の Form で Private に持ち、
# Closing の中でその次の Form のインスタンスを破棄していくソースを見たことが...



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2005-08-30 15:58
ApplicationContextクラスを使うとか

やりたいこととは違いますが、form1→form2の順に画面を遷移させる場合は
以下のようなコードになります。

コード:
class MyApplicationContext : ApplicationContext 
{
	private Form1 form1;
	private Form2 form2;

	private MyApplicationContext() 
	{
		form1 = new Form1();
		form1.Closed += new EventHandler(OnFormClosed);            
		form1.Show();
	}

	private void OnFormClosed(object sender, EventArgs e) 
	{
		if (sender is Form1) 
		{
			form2 = new Form2();
			form2.Closed += new EventHandler(OnFormClosed);
			form2.Show();
		}
		else if (sender is Form2) 
		{
			ExitThread();
		}

	}

	[STAThread]
	static void Main() 
	{
		MyApplicationContext context = new MyApplicationContext();
		Application.Run(context);
	}
}

にゃんぎ
常連さん
会議室デビュー日: 2004/03/31
投稿数: 35
投稿日時: 2005-08-31 11:41
>じゃんぬねっと
ありがとうございます。
現在の仕様に不満と言うか問題はありません。
ただこのコーディングがあまりに見当外れでないか少々不安でした。
じゃんぬさんのおかげで安心できました。

>ゆうじゅんさん
なるほど。Formの遷移にClassをかますやり方はこのように実現できるのですね。
ありがとうございました。


今回はForm1>Form2・・と遷移していき、Formのコレクションを渡していく方法を取ろうと思います。

本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)