2016-05-09 4 views
0

親フォーム内でユーザーコントロールが使用されているC#WinFormsアプリケーションに特有の問題があります。 は、ここで問題のユーザーコントロールのコードです:C#WinForms Appのユーザーコントロールから親フォームを呼び出すときのNull参照例外

private void LoadMCQuestionScreen(clsQuestion MCQuestion) 
{ 
    ucMultiChoiceQuestion MCQuestionScreen = new ucMultiChoiceQuestion(MCQuestion, Players, glbintQuestionIndex, 
                       glbblTransYesOrNo, 
                       lstTransList.ElementAt(glbintQuestionIndex)); 

    MCQuestionScreen.Parent = this; 
    MCQuestionScreen.Show(); 
    } 

はここでクラッシュが発生しているユーザーコントロールのコードのブロックです:

private void QuestionIsAnswered(bool TimeExpired) 
{ 
    //MessageBox.Show("Points: " + glbintPoints.ToString(), "Info...", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    //Create a reference to frmMain. 

    if (TimeExpired == true) 
     glbblAnsweredCorrectly = false; 

     frmGame form1 = (frmGame)this.Parent; 
     **form1.LoadAnswerResponseScreen(glbblAnsweredCorrectly, glbstrAnsweringPlayer);** 
    spTickTock.Stop(); 
    MCPlayer.Dispose(); 
    tmrMCTimer.Dispose(); 
    if (pbQuestionImage.Image != null) 
    pbQuestionImage.Image.Dispose(); 
    this.Dispose(); 
} 

私は太字でライン上のNullReferenceExceptionを取得 -

"オブジェクト参照がオブジェクトのインスタンスに設定されていません。"

この行では、form1はnullです。この方法とユーザコントロールMCQuestionScreenは、クラッシュが発生したときに既に処分されています。

foreach (UserControl uctrl in this.Controls) 
     uctrl.Dispose(); 

コードが機能せず、2日後、私はまだ問題の実際の原因を突き止めることはできません。 は、私は「LoadMCQuestionScreen」メソッドの先頭にこのコードを試してみました。

+0

「メソッドを破棄する」ことはできません。 UCが処分された後にメソッドが呼び出される理由を調べる必要があります。デバッガの[コールスタック]ウィンドウを使用します。このウィンドウは、内容をあなたの質問に投稿する必要があります。クリスタルボールは、あなたが停止することを忘れて、それを実行させるタイマーであると言います。 –

+0

おそらく 'QuestionIsAnswered'メソッドの' this.Parent'はnullですか?コードをステップ実行して、 'ucMultiChoiceQuestion'インスタンスの' Parent'プロパティがどのポイントにあり、nullでないのかを判断します。何とか最初に設定されていないか、何かによって設定されていないかのいずれかです。 – Snixtor

答えて

0

このエラーメッセージは、インスタンス化されていないオブジェクトを参照しようとしたことを意味します。あなたはこれを行う必要があります:frmGame form1 = 新しい(frmGame)this.Parent;

と表示されていないコードのどこかにある可能性があります。