DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メインフォームの切り替え

環境/言語:[XP C# VisualStudio2010]
分類:[.NET]

前回はお世話になりました。

今回はフォーム自体のことで質問させていただきます。

MainのなかでApplication.Run(new Form1());を使いフォーム(Form1)を起動していて、その中でイベントが発生したときに新たにフォーム(Form2)を起動してMainで起動したフォームを非表示に(隠す)する。
新しいフォーム(Form2)内であるイベントが発生した時に、先ほど隠しておいたフォーム(Form1)を再表示してForm2を非表示にする。

この動作を3つのフォーム間で実装したいと考えていますが、C#での実装は可能でしょうか?

よろしくお願いします。

イメージは

 ┌→ Form1←┐
 ↓         ↓
Form2 ←─→ Form3

こんな感じで、3つのフォームのうち1つしか表示しないようにしたいです。
2010/07/30(Fri) 16:38:40 編集(投稿者)

お世話になっております。

Formクラスのインスタンスをどこかで作成して
そのインスタンスのShowメソッドとHideメソッドで
表示/非表示を切り替えるとよろしいかと。

「どのインスタンスを表示するか?」の切り替えはifやswitchでどうぞ。

あとは閉じる動作(×ボタンとか)をキャンセルする方法を実装しておかないと
破棄されたFormインスタンスを呼び出してエラー。という事態が起こりますので
そこだけは注意が必要ですかね。
返信ありがとうございます。

ShowメソッドとHideメソッドで切り替えると、デバッグモードでフォームをCloseメソッドを使って終了しようとすると、デバッグモードが終わらず(内部的にまだ動いてる?)手動でデバッグの停止ボタンをおさないといけません。

はじめの説明が足りなかったら申し訳ありませんが、フォームを新しく作るのではなく、以前に隠したフォームを呼び出すようにしたいと思っています。

引き続きお願いいたします。
2010/07/30(Fri) 17:37:59 編集(投稿者)

■No27145に返信(みさきさんの記事)
> はじめの説明が足りなかったら申し訳ありませんが、フォームを新しく作るのではなく、以前に隠したフォームを呼び出すようにしたいと思っています。
ぱいらさんの書き込みで間違っていませんよ。
みさきさんの意図も理解しておられます。
フォームを新しく作るようには書いていませんので。

> ShowメソッドとHideメソッドで切り替えると、デバッグモードでフォームを
> Closeメソッドを使って終了しようとすると、デバッグモードが終わらず
> (内部的にまだ動いてる?)手動でデバッグの停止ボタンをおさないといけません。
それはインスタンスの管理ができていないからでは?
new すると新しいインスタンスが作成されます。
最初に呼び出されたときにのみ new して、そこで変数に格納された
参照アドレスを保持し、2回目以降で利用してください。

例えば、
[DOBON.NET > プログラミング道 > .NET Tips > フォーム > フォームが一つしか表示されないようにする ]
http://dobon.net/vb/dotnet/form/singleform.html

# ShowメソッドとHideメソッドで切り替える事とは別問題です。
# 表示・非表示を切り替えるだけのメソッドですから、同じ
# インスタンスに Close を命令すれば、Show、Hide していても
# 終了できます。

> ShowメソッドとHideメソッドで切り替えると、デバッグモードでフォームをCloseメソッドを使って終了しようとすると、デバッグモードが終わらず(内部的にまだ動いてる?)手動でデバッグの停止ボタンをおさないといけません。

Application.Runで起動したフォーム(Form1)を閉じないと、
アプリケーションは終了しないと思います。

Closeメソッドを使ってForm2やForm3を閉じたときに、
アプリケーションを終了させたい場合は、
FormClosingかFormClosedのイベントハンドラを利用して、
Form1を閉じるようにすればよいと思います。
こちらのサンプルも読みました?
http://dobon.net/vb/dotnet/form/showforminsequence.html
みなさま、ありがとうございます。

<るしぇさん
書いてある通りに、各Formでインスタンスを使い管理したところできるようになりました。

<Wajynさん
FormClosedを使ってForm1を閉じてたんですが、インスタンスを保持していなかったのでMainでRunしたForm1を閉じていなかったのが原因でした。

<Azuleanさん
そのサンプルも読んで試してみましたが、自分のやりたいことと少し違っていました。

レスしてくださった方々、本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板