2016-05-12 25 views
0

我是一個新手,我遇到了一些問題。 谷歌並沒有像我想的那樣幫助我,因爲我非常討厭要求別人花時間去尋求某些東西,但是因爲我在這裏呆了幾個小時,所以我會問。NullReferenceException - 與StackPanel,TextBox作爲OriginalSource,TextBox上的自定義MouseLeftButtonDown_Event的問題

首先,我有一個完美工作的xaml.codesource。我已經吞沒了StackPanel中的30個TextBoxes,命名爲StackPanel'ScoreList'並添加了MouseLeftButtonDown_Event {ScoreList.AddHandler(FrameworkElement.MouseLeftButtonDownEvent,new MouseButtonEventHandler(ScoreList_Click),true); },這樣一旦我點擊一個文本框,它就會調用該事件。

一切工作,儘可能多的文本框(雖然你可能想搖頭,我的選擇使用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;  
    } 
} 

我目前有以下幾個問題:

  • 當我嘗試籤文本框X爲空,這在我拋出一個NullReferenceException。即使沒有檢查,它也會拋出一個NullReferenceException異常。

  • 我正在尋找想法或如何完全鎖定一個文本框一旦點擊。我的意思是,因爲我的TextBoxes上有一個Click_Event,那麼第二次點擊不會再次調用該事件。 (取消訂閱不會工作,因爲原因,不,真的原因,因爲StackPanel綁定到事件,我不能取消訂閱整個事件,當我想要的是'取消訂閱StackPanel內的單個文本框'

對不起,打擾你們。我可能已經給太多心思在裏面,因爲我想從像80行代碼很大程度上減少我的代碼5與我的想法。

+0

使用中斷點並觀察所有變量。這是常見的調試練習,這將有助於解決這個問題。 –

+1

這個異常發生了什麼?你是否使用了一個調試器,並檢查是否有任何變量在發生異常時爲空。 – Joe

+0

如果你閱讀你的代碼,當x爲空時會發生什麼?它會轉到第二個if語句並嘗試訪問'x.Text' - 但x爲null,因此您會收到nullreferenceexception。你也在描述其他問題。你可以試着把它保留在一個問題上嗎?我不確定這個問題如何得到合理解答。 – Default

回答

0

首先要做的是放棄斷點進入,逐行進行,甚至會發生什麼情況?知道我們可以說出了什麼問題很有用

在debu你可以懸停在一個變量上,它會說出它是什麼,它是否爲空,甚至可以調查它的屬性。

我看到一個可能出現的問題與您的代碼:

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

您所檢查的X不爲空在這裏,但裏面你不使用它。你是否試圖執行空檢查?我不知道這消息應該是一個警告,或者只是你的代碼等的一部分,我希望看到這樣的:

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

如果執行空校驗。請注意,它調用return;,因此該方法存在而沒有繼續。

那麼,或者你只想讓用戶看到郵件,如果他們點擊了文本框,在這種情況下罰款,除非你實際上沒有空檢查代碼的空異常可能會發生(訪問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

非常感謝。但問題似乎是我使用了OriginalSource而不是Source,並且它似乎是null出現的唯一原因。 儘管如此,您的評論是有幫助的,我寫我的空檢查完全錯了。 謝謝。 噢,「每個文本框一次點擊」部分看起來很好/完美,我會用它!再次感謝。 (因缺乏聲譽而無法投票) –