Winforms 禁用元素的数字向上向下背景颜色更改

Winforms 禁用元素的数字向上向下背景颜色更改,winforms,c#-4.0,numericupdown,Winforms,C# 4.0,Numericupdown,在我的winform应用程序中,我试图对必填字段进行颜色编码。在用户编辑时,当填写所需输入时,背景变为浅绿色,如果必填字段为空,则背景为红色。 某些字段根据其他字段中的输入启用和禁用,因此有时我需要禁用的字段,并且应该完全禁用(禁用彩色背景)。 这就是我对背景变化的看法: public static void UpdateBackgroundColor(this NumericUpDown control) { if (!control.Enabled) { co

在我的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上也可以正常工作,没有任何问题。 但数字倒计时是一种错误行为。 当字段为必填字段且为空时,我会看到:

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

当背景为绿色并被禁用时,也会发生同样的情况

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

UPD:根据韩的回答,我很快更新了代码,但仍然不起作用

    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的所有子控件,并在那里更改了背景颜色,但仍然可以在文本框周围找到框架。还有其他想法吗


干杯

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

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

您需要修复设置嵌套控件背景色的代码,不管它看起来像什么。可能是控件集合上的foreach。

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

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


哦,我只在经典主题中见过它(并不是说我尝试了所有可能的主题,但它肯定与GUI主题有关)。

很抱歉,我问了一个将近5年的问题。这是NUD控件中的一个bug。我目前正在将一个旧的Windows CE应用程序移植到Windows 10。我们对CE中的NUD控件没有问题,但现在它们都显示出与trailmax完全相同的问题

我可以补充一点观察。禁用该控件时,不会刷新子控件的帧。背景色没有影响。屏幕上先前显示的内容将显示在NUD控件的内部框架上。在我们的应用程序中,我们使用了几个选项卡页。根据之前显示的屏幕,我们会看到破碎的画面,有时甚至是彩色的画面

我现在唯一的解决办法是在屏幕上显示控件后启用和禁用它。正如我所说,我们的控件在TabPages上,所以我使用的是tabselected事件。由于我们有许多选项卡和许多NUD控件,从5到20,我循环所有NUD控件并执行以下两行:

   nudControl.enabled =  !nudControl.enabled
   nudControl.enabled =  !nudControl.enabled
我不需要检查控件是否已启用,我只需将其切换到相反的值,然后再切换回来。在我们的应用程序中,它执行得非常快,我看不到屏幕上有任何视觉闪烁。同样,在任何给定的选项卡页上,我们只有不到20个NUD


另外,我使用StackOverflow帖子中的代码获取所有子NUD控件:

设置红色背景和禁用NumericUpdown控件的顺序是什么?哪个先做?禁用控件或设置背景?尝试更改顺序。首先是红色,然后禁用。我来研究一下颜色的应用顺序。你知道这一点吗?我对DomainUpDown控件也有同样的问题。在textbox控件和domainupdown控件的边框之间有一条很小的线,我不知道如何着色。我也很难想出一个简单的例子来说明这个问题。@CramerTV不,从来没有解决过。就这样离开了。客户似乎并不介意这个小故障。很高兴它能为你解决。我的问题是,控件从web浏览器中拾取了一种颜色,我在创建控件后正在调整其大小(更小)。最后,我在添加控件之前隐藏了浏览器,即使在添加控件之后,我也不得不在浏览器停止离开该行之前隐藏它,然后再执行“Application.DoEvents()”。Hans,感谢您提供的heads up重新组合控件,这是前所未有的。我尝试了您的建议(请参阅问题更新代码),但没有解决问题。我仍然有框边-(我仍然不知道如何重新设计您的特定问题。也许这个问题会有帮助:确实是一个老问题-我甚至没有这个项目的代码了!对持久性投赞成票!