- ベストアンサー
VB.NETでForm1からForm2を開く方法と閉じる方法は?
- VB.NET2005でForm1にあるCheckBoxをTrueにするとform2をモードレスフォームとして開き、CheckBoxをFalseにするとform2を閉じる方法がわかりません。
- form2の[×]で閉じた時にはForm1にあるCheckBoxをFalseにする方法がわかりません。
- CheckBox2_CheckedChangedのコードを使用して、フォーム2の表示と非表示を制御する方法が不明です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Form1にあるCheckBoxがCheckBox1なのかCheckBox2なのか・・・ >Private Sub CheckBox2_CheckedChanged ・・・ >If CheckBox1.Checked = True Then ただ、vb.netでは Private Sub CheckBox2_CheckedChanged(...) Handles CheckBox1.CheckedChanged と言うのはアリで、上の場合ならCheckBox1のCheckedChangedイベントになります。 質問の・・・がどうなってるのかにもよりますが。 それと、vb2002,vb2003で必要だった(と言うかこちらが正当だという話もある) Dim Form2のインスタンス As New Form2() はいらないみたいです。 と言う訳で、Form1にあるCheckBox1からForm2と言う場合です。 Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged If CheckBox1.Checked = True Then AddHandler Form2.FormClosed, AddressOf Form2FormClosed Form2.Show() Else Form2.Close() End If End Sub Private Sub Form2FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) CheckBox1.Checked = False End Sub
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
Form2のインスタンスを保持する変数をクラスレベルの変数にしましょう Public Class Form1 Private oFrm2 as Form2 End Class といった具合に クラスレベルの変数としておいて Private Sub CheckBox2_CheckedChanged ・・・ Dim f_cnt As Integer 'Dim form2 As New Form2() f_cnt = My.Application.OpenForms.Count If CheckBox1.Checked = True Then if oFrm2 is nothing then 'Form2 をインスタンス化する oFrm2 = new Form2 end if If f_cnt = 1 Then oFrm2.Show() 'モードレスフォームとして表示する Else oFrm2.Close() ←閉じない End If End Sub といた具合で行います
補足
早々のコメントありがとうございます。 教えて頂いたコードで試してみましたら、 oFrm2を開いて閉じた後、2回目oFrm2を開く 操作でエラーで止まってしましました。 「破棄されたオブジェクトにアクセスできません。オブジェクト名 'Form2' です。」 Application.OpenForms.Countの使い方が よくないのかな・・・
お礼
すみません、Form1にあるのはCheckBox1でした。誤記でした。 教えて頂いたコードに修正し実行しましたら イメージしていた通りの動きになりました。 ありがとうございました。