3

在我的 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 行为不端。这是我在该字段为必填且为空时看到的内容:

在此处输入图像描述

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

在此处输入图像描述

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

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

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

干杯!!

4

3 回答 3

3

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

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

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

于 2012-12-04T13:43:25.497 回答
1

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

我可以补充一点观察。当控件被禁用时,子控件的框架不会被刷新。背景颜色没有影响。之前在屏幕上显示的任何内容都会显示在 NUD 控件的内框上。在我们的应用程序中,我们使用了几个 TabPages。根据之前显示的屏幕,我们会出现损坏的帧,有时还会出现彩色帧。

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

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

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

PS 我使用 StackOverflow 帖子中的代码获取所有子 NUD 控件: 如何获取特定类型(按钮/文本框)的 Windows 窗体窗体的所有子控件?

于 2017-11-15T13:12:21.463 回答
0

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

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

请参阅NumericUpDown 背景颜色未按预期工作

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

于 2015-10-08T11:40:01.573 回答