2013-01-02 234 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