2

我想编写一个用户可以在 NumericUpDown 控件中输入数字的应用程序。在运行时确定的数字(例如范围)有一些条件。为了向用户提供反馈,当至少一个条件不满足时,我将 NumericUpDown 的 BackColor 更改为红色。到目前为止,它按我期望的那样工作。

现在我想向 NumericUpDown 添加一个工具提示来解释为什么数字是“错误的”。当我使用事件 NumericUpDown_BackColorChanged 来调整文本时,该事件不会“触发”。这是为什么?

我想这与Hans Passant在这里这里所说的 NumericUpDown 的复合字符有关。但我不确定。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 :(
    }
4

2 回答 2

4

我已经确认NumericUpDown.BackColor属性设置器确实没有调用OnBackColorChanged(至少在 .NET 4.0 中)。

我认为发生这种情况是因为该BackColor属性已被覆盖UpDownBase以还设置BackColor内部的复合控件,NumericUpDown并且可能有人忘记调用基本实现(我很想听听这里的一些 WinForms 专家的意见)。

您可以做的是创建一个FixedNumericUpDown控件,该控件继承NumericUpDown并覆盖该BackColor属性,如下所示:

public Color BackColor
{
    override set
    {
        base.BackColor = value;
        OnBackColorChanged(EventArgs.Empty);
    }
}
于 2013-01-02T14:03:05.230 回答
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;
        }
    }
于 2013-01-02T13:31:29.550 回答