WindowsFormの消去方法について(C#)

このQ&Aのポイント
  • C#(WindowsForm)での画面遷移と消去方法について調べています。
  • Form3をモードレスで開く方法や、Form1を消してForm3を表示する方法を探しています。
  • また、Form3をCloseした場合に再度Form1を呼び出す処理についても考えています。
回答を見る
  • ベストアンサー

WindowsFormの消去について(C#)

こんにちわ。 C#(WindowsForm)で以下のような処理を考えています。 1.起動するとForm1(ログイン画面)が開く 2-1.認証に成功 → 3へ 2-2.認証に失敗 → メッセージを表示し、ログイン画面のユーザ名にフォーカスをセット 3.Form3(メインメニュー)を開く そこで、スタートアップの画面は、Form1で良いと思うのですが、 2-1の場合に、以下のようなコードを書いてみました。 *************************************** Form3 f = new Form3(); f.ShowDialog(this); f.Dispose(); this.Close(); *************************************** これでは、次の部分で目的を達成できませんでした。 A.Form3をShowDaialog(this)で開くと、モーダルモードで開くだけとなってしまう。 Showではモードレスとなるだけ。 B.Dispose、Closeを記述してみたが、Form3が開いた時に、 画面上からForm1が消えるわけではない。 Closeでは、システム自体が終了してしまう。 そこで、ShowDialogやShowではなく、Form1を消し、Form3を表示するメソッド等あるのでしょうか? ちなみに、Form3をCloseした場合に、Form1を再度呼び出す処理は考えていません。

  • nobil
  • お礼率90% (27/30)

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Form1をCloseしてしまうとプロジェクトの設定によってはアプリケーションが終了してしまいます また、非表示にする前に設定されたデータなども全て失います 単に非表示にしたいのであれば this.Hide(); で非表示しましょう 再表示するには this.Show(); で可能です 今回の場合なら ログイン用のForm1は モードレスでかまわないとも思います 2-1、2-2自体は Form1のなかで完結していればいいことだと思います .NET Framework1.0/1.1なら Mainプロシージャを工夫してやらないといけないでしょう .NET Framework2.0以降なら プロジェクトのプロパティの アプリケーションタブのシャットダウンモードを『最後のフォームが閉じたとき』にしてやればよさそうです

nobil
質問者

お礼

redfox63さん、回答ありがとうございます。 >また、非表示にする前に設定されたデータなども全て失います >単に非表示にしたいのであれば >this.Hide(); >で非表示しましょう >再表示するには this.Show(); で可能です Hide()とするのが良いのですね。 どうも、今まで、別言語でClose(に近い)とすると、 Form1がメモリから破棄されるようなイメージを持っていたので、 今回の件は不思議でした。 >2-1、2-2自体は Form1のなかで完結していればいいことだと思います この点、ご指摘の通りです。 >.NET Framework2.0以降なら プロジェクトのプロパティの アプリケーションタブのシャットダウンモードを『最後のフォームが閉じたとき』にしてやればよさそうです このプロパティも、初めて目にしました。 早速、やってみます。 ありがとうございます。

関連するQ&A

  • C#でのフォーム間のデータの受け渡しについて

    フォーム間のデータ(パラメータ等)の受け渡しについて教えてください。 現在Form1からForm2を起動させる場合、以下のようにForm2のインスタンスの生成時のパラメータを設定してもForm2のLoadイベントでは拾うことはできないのでしょうか? ↓実際のコード //Form1クラスのインスタンスを作成する //引数(a,b) Form2 f = new Form2(a,b); //Form1を表示する //ここではモーダルダイアログボックスとして表示する //オーナーウィンドウにthisを指定する f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f.Dispose(); また、上記の方法が違っていた場合、方法としてどのようなやり方があるのか教えてください。 よろしくお願いいたします。

  • C# form

    Button _Button = (Button)sender; int but = 0; if (_Button.Name == "button1") { but = 1; } if (_Button.Name == "button2") { but = 2; } if (_Button.Name == "button3") { but = 3; }      //Form2クラスのインスタンスを作成する Form2 f2 = new Form2(this); //Form2を表示する //ここではモーダルダイアログボックスとして表示する ////オーナーウィンドウにthisを指定する //f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f2.Show(); 上記のようにボタン配列を作成し,クリックイベントを発生させています.そこで押されたボタンにより butに所定の値を入れてこれを,form2において判断値として使用したいのですが,どのようにすれば 良いでしょうか? 昨日から悩んでいるのですが自分だけでは解らないのでご教示願いたいと思います.

  • (VB2008EEです)Form1からForm2をモーダレスで表示(S

    (VB2008EEです)Form1からForm2をモーダレスで表示(Show(Me))したのち、 Form2を、(Form2の)閉じるボタン(右上にあるXボタン)で閉じるときに、 単にHideするだけの処理に変更することは可能でしょうか。 デフォルトでは、閉じるボタンですと、Close()と同様、 Close(&Dispose)となると思いますが、Hide()処理に 変えられるかということです。 。。。 試しに、FormClosingイベントハンドラでHide()→e.cancel=Trueって やってみたところ、(再度同じForm2のインスタンスを使ってShowができ、 さらに前回のText表示などが残っているなど)その場はうまく行ったように 見えたのですが、そうすると、アプリ(Form1)が閉じるボタンで終了しなくなって しまいました。 (Application.Exitでもダメ、Endでは(強制終了とのことなので)OKですが) Form2のClose処理をCancelしているからだ、とは思いますが。 ShowDialog→Xボタン(同じ記述のまま) の後では、終了可能です。 では、Show→Xボタンのあとで、同じインスタンスで、上記と同じように、 ShowDialog→Xボタンとしたあと、Form1のXボタンでアプリを 終了させようとするとどうなるか。 結果は、終了不能でした。 一度Show→Xしたらそれをどこかに覚えている?ってことなのでしょうか。。。 ここらへんの現象まで、合わせて説明できる方がいらっしゃったら 合わせてご説明いただけませんでしょうか。 。。。 なお、なぜこんなことするの?という実際論はここではなしで 純粋に技術論でお願いいたします。

  • C# 2010 printPreviewDialogの消去法

    C# 2010 printPreviewDialogの消去法 印刷プレビューのダイアログを表示して左上のプリンタ釦を押下して印刷します 印刷が完了してもダイアログは表示され続けています この状態でもう一度ボタン1を押すと(1)のところで下記のエラーが起こります 『既に表示されているフォームをモーダルダイアログボックスとして表示出来ません。showDialogを呼び出す前に、フォームのVisibleプロパティをfalse にしてください』 素直な私は(1)の前に this.printPreviewDialog1.Visible = false; を加筆して再度実行したのですが 『既にモーダルに表示されているフォームはモーダル ダイアログ ボックスとして表示できません。showDialog を呼び出す前に、フォームを閉じてください。』 とのエラーになりました フォームを閉じろといわれても printPreviewDialog1.ShowDialog(); から戻ってきません。(2)が表示されないのです。 private void button1_Click(object sender, EventArgs e) { this.printPreviewDialog1.Document = this.printDocument1; printPreviewDialog1.ShowDialog(); -----(1) MessageBox.Show("printPreviewDialog End"); ----(2) } A どうしたら戻ってくるのでしょうか? B もし戻って来ないならどのようにすれば良いのでしょうか? 更に一般的にはどのように処理しているのですか? 基礎学力の欠如している私をお助けください

  • CloseとDisposeの違い

    みなさまこんばんわです。よろしくお願い申し上げます。 VB.NET 2008でコーディングしています。 CloseとDisposeの違いについて教えていただきたいのです。 これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。 たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。 これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。 そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。 ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。 わけわからなくなってきました。。。 ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。 ここで4つの仮説を立ててみました。 1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる 2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる 3. 呼び出し方ではなく、別の要因が存在する 4. 併記する必要がある場合がある Me.Close() Me.Dispose() または、 Me.Dispose() Me.Close() どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

  • Visual Studio 2005 C# フォームのせいでエラー?

    まず電話がかかってくると電話番号をもとに電話をかけてきたひとの情報をデータベースから取り出して表示するという簡素なウィンドウズプリケーションおVS2005,C#で書いてます。VSもC#使い始めて何週間かという初心者です。 メインのフォーム(フォーム1)があって、あるフォーム1にある値をユーザー変更するのに2つめのフォームをつかって入力できるようにしたのですが、閉じてから電話がかかってくるとbase.Dispose(disposing)というところでエラーになります(いつもここの個所がエラーになるみたいですが。。)。電話がかかってきて電話番号をしらべるときは、フォームにあるテキストボックスなどのコントロールやオブジェクトはクリアにしています。 2つめのフォームはフォーム1から Form2 form2 = new Form2(); form2.ShowDialog(this); で開いて フォーム2では (Form1)this.Owner)でフォーム1の値を変更したすぐに this.Dispose(); でフォーム2を閉じます。 試しにform2.Show(this);にして2つめのフォームを閉じないようにしたらエラーにはなりませんでした。 これだけの情報でわかるかどうかわかりませんが、フォーム2の扱いに問題あるのでしょうか? よろしくお願いします。

  • (VB2008)ShowDialogしたFormを閉じた時の、画面の挙

    (VB2008)ShowDialogしたFormを閉じた時の、画面の挙動について (VB2008EE、OSはVista) Form1からForm2を(ボタンのクリックイベントで) Dim f As New Form2 f.Show(Me) と記述して表示させたあと、 Form2の(ボタンのクリックイベントで) Me.Hide() として、Form2を閉じる記述を書きました。 で、Form2をShowDialogしてから、Hideを実行すると、 Form2が消えるのはいいのですが、残るForm1が、 ・デバッグ実行時は、VB2008EEのWindowの後ろに隠れてしまい、そのままとなる。 ・リリースビルドでは、さすがにそのままとはなりませんが、一旦Form1が  ちらつきます。 この回避策がありましたら教えてください。 。。。 ここからは、いろいろ実験した結果です。 ・試しに、Me.Hide()の後ろに、Threading.Thread.Sleep(5000)を 記述して実行すると5秒間Form1が後ろのアプリ画面に隠れた後、 Form1が前に表示される。 ・この場合の「後ろの別アプリのWindow」について、その別アプリが VB2008やエクスプローラだとForm2がそのアプリに隠れるのですが、 ExcelやIEだと、Form1が後ろに隠れることがないようです。。。 ・Hideではなく、Closeだと、後ろには隠れません。 (ただし、Closeの場合、Threading.Thread.Sleep(5000)の間はForm2は その前にClose()があっても、表示されたままSleepしその後閉じます) ・さらにShowDialog()でなく、Show()の場合、Owner指定して実行した場合は、 (つまりSHow(Me))全く問題なく、Form1が前面に表示されたまま 他のアプリが前に来ることはないのですが、 Ownerを指定せずにShowしたところ、ShowDialogと同様のことが起きるようです。 もし、これらの現象全体についてしっかりと説明できる方がいらっしゃれば、 説明もしていただけるとうれしいです。

  • VB 2005の処理について

    質問です。 showとshowdialogの違いについて教えてください。 また逆に、Dispose メソッド、Close メソッドの違いについて教えてください。

  • 【VB.NET2003】フォーム1を閉じてフォーム2を表示させたい

    プログラミング初心者でVB.NET2003使用です。 検索したところ、それらしいものがあったのでチャレンジしましたがダメだった(ちょっと違う?)ので質問させていただきます。 http://oshiete1.goo.ne.jp/qa1757174.html 《やりたい事》 Form1に配置したボタン1をクリックするとForm1を閉じてForm2を表示 Form2に配置したボタンAをクリックするとForm2を閉じてForm1を表示する。 これをやりたいのですが、なかなかうまく行きません。 ボタン1をクリックしてForm1を閉じないでForm2をShowかShowDialogでモードレス表示 ボタンAをクリックしてForm2をCloseさせてForm1を表示させる事(元々閉じていないので)は出来ます。 可能ならばどちらかを必ず閉じる方法でやりたいと思います。 可能でしょうか? 解決策やヒント、良いサイトがありましたら回答をお願いします。

  • C# 2010 PrintPreViewDialogの連続表示について

    C# 2010 PrintPreViewDialogの連続表示について NotifyIconからPrintPreViewDialogを表示して印刷します 印刷が完了してもDialogは表示されています この表示中にNotifyIconを再度押すと(1)で下記のエラーとなります 『既に表示されているフォームをモーダルダイアログボックスとして表示できません showDialogを呼び出す前にフォームのvisibleプロパティをfalseにしてください』 となりますが、Form1、printPreviewDialogのプロパティにはVisibleが見当たりません 何処をどうすれば良いのでしょうか? また印刷が完了した後にDialogを消去して、NotifyIconを押すと同じく(1)でエラーが発生します 『破棄されたオブジェクトにアクセスできません』 じゃあ、全体的にどのようにすれば良いのですか? この件に連休前からハマリ込んでおります、お助けください!!! private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { this.printPreviewDialog1.Document = this.printDocument1; printPreviewDialog1.ShowDialog(); -----(1) printPreviewDialog1.Close(); -----(2) } 追伸】(2)はDisposeのほうが良いのですか? それとも不要なのですか?