2016-04-16 3 views
0

現在、私のWindowsフォームには、いくつかのWinFormsがあります。 1つのWinFormはメインメニューとして機能し、別のフォームを2次ウィンドウとして単独で呼び出すことになっています。フォーム間で渡されたデータの処理

Private Sub btnMainGame_Click(sender As Object, e As EventArgs) Handles btnMainGame.Click 
    ' This is the button to call up the main game controller. So simply hide this form aned then open the new form. 

    Dim frmController As New frmControllerScreen 

    frmController.Show() 
    Me.Hide() ' Happens on .Close as well 

End Sub 

上記のコードは、さらに多くのオプションを処理するために使用される別のWinFormを呼び出します。ユーザーが特定のボタンをクリックすると、サブフォームが再び作成されます。

Dim OpenNewGameWindow As New frmGameConfig 

    OpenNewGameWindow.ShowDialog(Me) 
    Me.DialogResult = DialogResult.None ' Used to prevent the subform from closing the main form when it catches a dialog result. 

frmGameConfigでは、プログラムはデータを受け取り、それを呼び出したフォームに戻すことになっています。

Private Sub btnNewGameStartGame_Click(sender As Object, e As EventArgs) Handles btnNewGameStartGame.Click 
' ... Skipped code... 
    frmControllerScreen.MasterQuestionList = QuestionList 
    frmControllerScreen.blnBankedTime = cbBankedTime.Checked 

' ... Skipped code... 
End Sub 

しかし、frmControllerはMasterQuestionListを参照しようとすると...それは、それが設定されていないかのようにnullreferenceエラーを返します。私はこのコードを作ったときに物事が面白い取得するのはここ

だ...

は、frmControllerScreenは実際にスタートアップフォームでした。今度はこのフォームをfrmMainMenuに戻すと、常にNullReferenceのエラーが出ます。

私の質問:親フォームからインスタンス化されていれば、あるフォームから次のフォームに情報を渡す方法を教えてください。 (注:私は宣言を "モジュール全体の"変数としてPublicに移しました...同じことは何も起こりませんが)同じエラーは先に進み、frmController.MasterQuestionListと宣言しても起こります。

+0

あなたは 'this'すなわちメインフォームに' MdiParent'プロパティをfrmController' 'に割り当てましたか?ここには、[例](https://msdn.microsoft.com/en-us/library/system.windows.forms.containercontrol.parentform(v = vs.110).aspx?cs-save-lang = 1&cs- lang = vb#code-snippet-1) 'frmController.MasterQuestionList'をどのように宣言しますか? –

+0

@BassemAkl:MDIがこれに収まるとは思わない。なぜなら、これは複数のフォームがそれぞれのフォームに読み込まれるのではなく、むしろ複数のフォームウィンドウが読み込まれるからだ。 –

答えて

1

呼び出されたフォームから呼び出し元にデータを戻すのではなく、呼び出されたフォームのコントロールを.ShowDialogの後の呼び出しコードから参照できます。 OpenGameWindowボタンクリックで

Dim OpenNewGameWindow As New frmGameConfig 

If OpenNewGameWindow.ShowDialog() Then 
    MasterQuestionList = OpenNewGameWindow.QuestionList 
    blnBankedTime = OpenNewGameWindow.cbBankedTime.Checked 
End If 

Private Sub btnNewGameStartGame_Click(sender As Object, e As EventArgs) Handles btnNewGameStartGame.Click 
    Me.DialogResult = True 
End Sub 
+0

うーん、私はこれを行って、何が合うか見てみましょう。 –

+0

ウィンドウが閉じてもそれが消えないからです。それが範囲外になるか、Disposedになるまでではないので、インスタンス化すると、その中のすべてがFriendであり、アクセス可能になります。 – MrGadget

+0

私はまだそのことを念頭に置いて財産を呼び出すことができましたか?私はそこに問題があると思う。 –

関連する問題