1. ホーム
  2. vb.net

[解決済み] VB.netの開閉フォーム

2022-02-07 04:59:38

質問

私は2つのフォームを持つVBプログラムを持っており、私はそれぞれのフォームのフォームロードをコード化しました。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    MessageBox.Show("I AM FORM 1")
End Sub

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    MessageBox.Show("I AM FORM 2")
End Sub

Form1 と Form2 を切り替えるには、ボタンを使用します。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Me.Hide()
    Form1.Show()

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Me.Hide()
    Form2.Show()

End Sub

しかし、フォームを切り替えるたびに、フォームロードイベントは一度しかトリガーされません。私のコードに何か問題があるのでしょうか?Me.Hide()は前のフォームを隠すだけで、完全に閉じないのではと思います。前のフォームを閉じて、再び開くときにフォームロードイベントが再びトリガーされるようにしたいのです。

どのように解決するのですか?

<ブロッククオート

しかし、フォームを切り替えるたびに、フォームロードイベントは一度しかトリガーされません。私のコードに何か問題があるのでしょうか?Me.Hide() は前のフォームを隠すだけで、完全に閉じないのではと思います。

まさにこの通りです。その Hide メソッドは、ただ を隠す を表示し、フォームを見えなくします。

探しているのは Close メソッド で、実際にフォームを閉じます。(フォームを表示するために Show メソッドを呼び出す必要はありません。 Dispose .)

しかし、フォームを閉じて、そのメソッドでコードを実行し続けることはできません。そこで、イベントハンドラ関数の記述順序を逆にして、もう一方のフォームを表示する必要があります まず をクリックし、自分自身を閉じます。こんな感じにしてください。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form1.Show()
    Me.Close()    
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Show()
    Me.Close()
End Sub

これで思い通りになります。その Load を呼び出すたびにイベントが発生します。 Show メソッドで新しいフォームを作成し、表示しているからです。

しかし、VB.NETの珍しい特性を利用していることは指摘に値します。後方互換性の理由から、古いVB言語から残しているものです。VB.NETでは オブジェクト のフォームクラスを (他のすべてのクラスオブジェクトと同じように) 参照しています。 タイプ という名前(クラスの名前そのもの)を使います。これは本当にやってはいけないことで、さまざまな頭痛の種になり、コードを読む人を混乱させることになります。このように、単に新しいフォームオブジェクトをインスタンス化する方がよいでしょう。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim frm As New Form1  ' create a new Form1 object
    frm.Show()            ' ... and display it

    Me.Close()
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim frm As New Form1  ' create a new Form2 object
    frm.Show()            ' ... and display it

    Me.Close()
End Sub

このコードを実行すると、すぐに別の問題にぶつかるでしょう。 Form1 アプリケーション全体が終了してしまいます。これは、新しいプロジェクトではデフォルトで Form1 は、プロジェクトのプロパティ(ソリューションエクスプローラーの "My Project" )で "Startup form" として指定されています。どちらかにする必要があります。

  • を作成します。 サード フォームをメインフォームとして使用し、quot;Startup form"をこの第3のフォームに設定するか、または
  • シャットダウンモード("マイプロジェクト"にもあります)を、"スタートアップフォームが閉じたとき"から"最後のフォームが閉じたとき"に変更します。