2013-01-02 283 views
2

我想編寫一個應用程序,用戶可以在NumericUpDown控件中輸入一個數字。在運行時間中確定的數量(例如範圍)有一些條件。爲了給用戶提供反饋,當至少有一個條件不滿足時,我將NumericUpDown的BackColor更改爲紅色。到目前爲止,它的工作原理與我預期的一樣。事件numericupdown_BackColorChanged不會觸發

現在我想添加一個工具提示到NumericUpDown來解釋爲什麼這個數字是「錯誤的」。當我使用事件NumericUpDown_BackColorChanged來調整文本時,事件不會「觸發」。這是爲什麼?

我想它與NumericUpDown的複合字符有關,因爲Hans Passant已經說明了herehere。但我不確定。 TY提前幫忙。

private void numericUpDown1_ValueChanged(object sender, EventArgs e) 
    { 
     if (numericUpDown1.Value == 42) 
     { 
      numericUpDown1.BackColor = Color.Red; 
     } 
     else 
     { 
      numericUpDown1.BackColor = System.Drawing.SystemColors.Window; 
     } 
    } 

private void numericUpDown1_BackColorChanged(object sender, EventArgs e) 
    { 
     //something epic should happen 
     //but somehow my program never reaches these lines :(
    } 
+0

您是否設置了斷點,以確保代碼進入的第一個事件,而不會進入第二?或者是通過觀察結果得出結論嗎? – Rotem

+0

是的,我設置了一個斷點!顏色改變了紅色。斷點未達到。 –

+0

我的意思不是冒犯,我只是想確保,因爲我沒有理由認爲事件不會被觸發,無論它是一個複合控制。 – Rotem

回答

4

我已經證實了NumericUpDown.BackColor屬性setter確實不調用OnBackColorChanged(在.NET 4.0中至少)。

我認爲出現這種情況是因爲BackColor屬性已在UpDownBase被重寫還設置複合控件的BackColorNumericUpDown也許有人忘了調用基實現(我喜歡從一些的WinForms大師聽到這裏)。

你可以做的就是創建一個FixedNumericUpDown控制,從NumericUpDown繼承和覆蓋BackColor財產如:

public Color BackColor 
{ 
    override set 
    { 
     base.BackColor = value; 
     OnBackColorChanged(EventArgs.Empty); 
    } 
} 
+0

TY。基本上這是.NET框架中的一個錯誤?如果是的話,我可以寫一個錯誤報告。 –

+0

我討厭成爲那個哭泣的男孩,但它確實看起來像。 – Rotem

+0

錯誤報告:https://connect.microsoft.com/VisualStudio/feedback/details/775586/set-numericupdown-backcolor-dont-trigger-the-event-backcolorchanged –

0

建議:爲此,您可以通過在你通過拖放添加ErrorProvider,並從工具箱下降。

替換您的代碼如下:

private void numericUpDown1_ValueChanged(object sender, EventArgs e) 
    { 
     errorProvider1.Clear(); 

     if (numericUpDown1.Value == 42) 
     { 
      numericUpDown1.BackColor = Color.Red; 
      errorProvider1.SetError(numericUpDown1, "Select another number"); 
     } 
     else 
     { 
      numericUpDown1.BackColor = System.Drawing.SystemColors.Window; 
     } 
    } 
+0

ty。我會考慮這個。還有一點是,有一些外部事件會改變數字的條件(也就是說,這不是程序中用紅色改變顏色的唯一部分)。現在我正在尋找一種簡單的解決方案,以捕捉每個我改變了紅色的顏色。 –

+0

無論你在寫什麼numericUpDown1.BackColor = Color.Red;你也可以寫errorProvider1.SetError(numericUpDown1,「選擇另一個數字」); – Arshad

+0

@Arshad儘管您的解決方案有效,但這是一種解決方法,而不是解決方案。這裏有趣的問題是爲什麼不是事件觸發,而不是在這種特殊情況下可以做什麼來顯示錯誤。 – Rotem