禁用元素的NumericUpDown背景颜色更改

时间:2012-12-04 11:24:06

标签: winforms c#-4.0 numericupdown

在我的winform应用程序上,我正在尝试对必填字段进行颜色编码。在用户编辑时,当填写所需输入时,背景变为浅绿色,如果必填字段为空,则背景为红色。 根据其他字段中的输入启用和禁用某些字段,因此有时我需要禁用字段,并且应该完全禁用该字段(禁用颜色背景)。 这就是我对背景变化的看法:

public static void UpdateBackgroundColor(this NumericUpDown control)
{
    if (!control.Enabled)
    {
        control.BackColor = SystemColors.InactiveBorder;
        return;
    }

    var inputValue = control.Value;

    if (inputValue == 0)
    {
        control.BackColor = Color.Red;
        return;
    }
    control.BackColor = Color.LightGreen;
}

类似的功能适用于TextBox,工作正常,无毛刺。 但NumericUpDown行为不端。 这是我在需要该字段时看到的并且是空的:

enter image description here

但是当此字段被禁用时,它会在其周围留下红色边框:

enter image description here

当背景为绿色并被禁用时,会发生同样的故事。

那为什么会发生这种情况以及如何解决?

UPD:根据Han的回答,我很快更新了我的代码,但这仍然无效。

    private static void SetBackgroundColor(this Control control, Color color)
    {
        control.BackColor = color;
        foreach (Control childControl in control.Controls)
        {
            SetBackgroundColor(childControl, color);
        }
    }

我粗略地使用它:

numericUpDown1.Enabled = true;
numericUpDown1.SetBackgroundColor(Color.Red);
numericUpDown1.Enabled = false;
numericUpDown1.SetBackgroundColor(SystemColors.InactiveBorder);

尽管事实上我经历了NUD的所有子控件并改变了那里的背景颜色,但仍然在文本框周围得到了那个框架。还有其他想法吗?

干杯!!

3 个答案:

答案 0 :(得分:3)

NumericUpdown是多个控件的组合。文本框位于NUD内部,具有一个像素偏移量。所以你看到文本框'BackColor的设置与外部NUD控件不同。您的问题的真正原因在您的代码段中不可见,但此行为的重现是:

        numericUpDown1.BackColor = Color.Red;
        numericUpDown1.Enabled = false;
        numericUpDown1.Controls[1].BackColor = SystemColors.InactiveBorder;

您需要修复设置嵌套控件的BackColor的代码,无论它看起来如何。可能是控制系列的一个foreach。

答案 1 :(得分:1)

很抱歉碰到一个近5年的问题。恕我直言这是NUD控件中的一个错误。我目前正在将一个较旧的Windows CE应用程序移植到Windows 10.我们对CE中的NUD控件没有任何问题,但现在它们都表现出与trailmax完全相同的问题。

我可以添加一点观察。禁用控件时,不会刷新子控件的框架。背景颜色没有影响。先前在屏幕上显示的内容显示在NUD控制的内部框架上。在我们的应用程序中,我们使用几个TabPages。根据之前显示的屏幕,我们会破碎,有时会出现彩色框架。

我现在唯一的解决方法是在屏幕上显示控件后启用和禁用控件。正如我所说,我们的控件在TabPages上,所以我使用选项卡选择的事件。由于我们有很多选项卡和许多NUD控件,5到20,我遍历所有NUD控件并执行这两行:

   nudControl.enabled =  !nudControl.enabled
   nudControl.enabled =  !nudControl.enabled

我无需检查控件是否启用,我只需将其切换为相反的值,然后将其切换回来。在我们的应用程序中,这执行非常快,我没有看到任何视觉闪烁在屏幕上。同样,我们在任何给定的TabPage上都有不到20个NUD。

P.S。我使用此StackOverflow帖子中的代码获取所有子NUD控件:How to get ALL child controls of a Windows Forms form of a specific type (Button/Textbox)?

答案 2 :(得分:0)

我遇到了同样的问题,事实证明,这只是一个刷新/重绘问题。 标签设置无效,但不是整个控件,因此强制刷新后,边框消失。

或者只是隐藏并再次显示: - )

请参阅hint

哦,我只看到了经典主题(不是我尝试了所有可能的主题,但它肯定与GUI主题有关)。