2016-05-12 11 views
0

私はルーキーで、いくつか問題があります。 私は何かのために他の人に尋ねたり、時間を取ったりすることを真剣に嫌うので、私が欲しかったほどの助けはしていませんが、私は数時間ここで立ち往生しています。NullReferenceException - OriginalSourceとしてのStackPanel、TextBoxの問題、TextBoxのカスタムMouseLeftButtonDown_Event

まず、完全に動作するxaml.codesourceがあります。 私は、StackPanelの「ScoreList」という名前のStackPanelに約30のTextBoxを埋め込み、MouseLeftButtonDown_Event {ScoreList.AddHandler(FrameworkElement.MouseLeftButtonDownEvent、new MouseButtonEventHandler(ScoreList_Click)、true)を追加しました。 }をクリックしてTextBoxをクリックすると、そのイベントが呼び出されます。

すべては、TextBoxesと同じくらい機能します(ただし、ボタンの代わりにTextBoxesを使用することについて頭を振りたいかもしれませんが)重要ではないRandomListに応じてさまざまなスコアを表示します。イベントScoreList_Clickで今

...

private void ScoreList_Click(object sender, MouseButtonEventArgs e) 
{ 
    TextBox x = e.OriginalSource as TextBox; 

    if (x != null) 
    { 
     MessageBox.Show("Don't try this at home Kiddo"); 
    } 

    if (x.Text == "1" || x.Text == "2" || x.Text == "3" || x.Text == "4") 
    { 
     x.Text = "10"; 
     x.IsEnabled = false;  
    } 
} 

私は現在、問題を次ています

  • 私はnullをテキストボックスxをチェックしてみてください、それは私にとNullReferenceExceptionをスローします。チェックをしなくても、NullReferenceExceptionがスローされます。

  • 私はアイデアや、一度クリックしたTextBoxを完全にロックアウトする方法を探しています。私の意味は、TextBoxにClick_Eventがあるので、2回目のClickはイベントを再び呼び出さないということです。 StackPanelはイベントにバインドされているので、「StackPanel内の1つのTextBoxの購読を拒否」したいときは、イベント全体を購読解除することはできません。

  • 君たちの手を煩わせるため

申し訳ありません。私は私のアイデアを5に80行のコードなどから多額の私のコードを減らしたいと、それにあまりにも多くの考えを与えている場合があります。

+0

すべての変数を参照してください。これはこれを修正するのに役立つ共通のデバッグ方法です。 –

+1

例外は何行発生しますか?デバッガを使用して、例外が発生したときに変数のいずれかがnullであるかどうかを確認しましたか。 – Joe

+0

コードを読んだ場合、xがnullのときはどうなりますか? 2番目のif文に行き、 'x.Text'にアクセスしようとしますが、xはnullなので、null参照例外を取得します。他の問題についても説明しています。あなたは代わりに1つの質問にそれを維持しようとすることができますか?私はこの質問がどのように合理的に答えられるかはわかりません。 – Default

答えて

0
行うには

まず最初にドロップすることですブレークポイントを設定し、行ごとにステップを実行することができます。例外はどのような行でも起こりますか?それは何が間違っているのかを知るために役立ちます。

debuあなたは変数の上にカーソルを置くことができ、それが何であるか、それがヌルであるかどうか、そしてそのプロパティを調べることさえできます。

私はあなたのコードを持つ一つの可能​​な問題を参照してください。あなたは、xがここにnullでないことを確認されていますが、あなたの中にそれを使用していない

if (x != null) 
    { 
     MessageBox.Show("Don't try this at home Kiddo"); 
    } 

を。ヌルチェックを実行しようとしていますか?あなたがnullのチェックを実行している場合

if (x == null) 
    { 
     MessageBox.Show("Null text box"); 
     return; 
    } 

:このメッセージは、私のようなものを見ることを期待したい警告、またはあなたのコードなどのほんの一部であると考えられる場合、私はよく分かりません。 return;が呼び出されるので、メソッドは存在しないので存在します。

これは、テキストボックスをクリックした場合にのみメッセージを表示したい場合です。実際には、null例外(xにアクセスする)可能性があります。何か)ここに:

if (x.Text == "1" || x.Text == "2" || x.Text == "3" || x.Text == "4") 
    { 
     x.Text = "10"; 
     x.IsEnabled = false; 
    } 

それは、このような構造にする必要があります。

TextBox x = e.OriginalSource as TextBox; 

    if (x != null) 
    { 
     MessageBox.Show("User clicked textbox message"); 


     //this is within the not null check 
     if (x.Text == "1" || x.Text == "2" || x.Text == "3" || x.Text == "4") 
     { 
      x.Text = "10"; 
      x.IsEnabled = false; 

     } 
    } 

またはこの:それだけでテキストボックスごとにワンクリックのためにそれを行うためとして

TextBox x = e.OriginalSource as TextBox; 

    if (x == null) 
    { 
     MessageBox.Show("User has not clicked text box message"); 
     //exit method 
     return; 
    } 

    //this is only reached if x is not null 
    if (x.Text == "1" || x.Text == "2" || x.Text == "3" || x.Text == "4") 
    { 
     x.Text = "10"; 
     x.IsEnabled = false; 
    } 

、ありますあなたがこれを行う方法の数まず、クリックしたアイテムをリストや辞書のようなものに保存し、それが存在するかどうかを確認してから続行します。

List<TextBox> alreadyClickedTextBoxes = new List<TextBox>(); 

ScoreList_Click(object sender, MouseButtonEventArgs e) { 

    TextBox x = e.OriginalSource as TextBox; 

    //check this is a text box, and has not been clicked 
    if (x != null && !alreadyClickedTextBoxes.Contains(x)) 
    { 
     MessageBox.Show("Don't try this at home Kiddo"); 

     if (x.Text == "1" || x.Text == "2" || x.Text == "3" || x.Text == "4") 
     { 
      x.Text = "10"; 
      x.IsEnabled = false; 
     } 
     //we don't want to click this again 
     alreadyClickedTextBoxes.Add(x); 
    } 
} 
+0

ありがとう。しかし、Sourceの代わりにOriginalSourceを使用していたように見えたのは、nullが出てきた唯一の理由だと思われました。 それにもかかわらず、私のヌルチェッカーを完全に間違って書いてしまったというあなたのコメントは役に立ちました。 ありがとうございます。 「テキストボックスごとに1回クリックする」の部分は問題ない/完璧なようですが、私はそれを使用します!再度、感謝します。 (評判がないため投票できません) –

関連する問題