Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未传递到静态方法的控件的标记属性_C#_.net_Winforms_Controls - Fatal编程技术网

C# 未传递到静态方法的控件的标记属性

C# 未传递到静态方法的控件的标记属性,c#,.net,winforms,controls,C#,.net,Winforms,Controls,我在一个类HUD.cs中有下面的方法,它有helper方法。支持以下方法来检查所有控件标记是否为“必需”,并突出显示找到的控件 如果我从UserControl调用它,并且要突出显示的控件不包含在GroupBox中,但当它们被包含时,标记似乎不会出现,那么它就可以正常工作。想法 以下是方法--> 这应该是正确定位标记(您可以通过在调试器中单步执行来检查这一点),因此我认为图形更有可能出现问题。这里有几件事可能会引起问题 首先,Control.Bounds属性是相对于父元素的。因此,当您递归到“子控

我在一个类HUD.cs中有下面的方法,它有helper方法。支持以下方法来检查所有控件标记是否为“必需”,并突出显示找到的控件

如果我从UserControl调用它,并且要突出显示的控件不包含在GroupBox中,但当它们被包含时,标记似乎不会出现,那么它就可以正常工作。想法

以下是方法-->


这应该是正确定位标记(您可以通过在调试器中单步执行来检查这一点),因此我认为图形更有可能出现问题。这里有几件事可能会引起问题

首先,Control.Bounds属性是相对于父元素的。因此,当您递归到“子控件”集合时,矩形是在“错误”的坐标处绘制的:例如,如果子控件位于组框的左上角,则其边界可能是(0,0100100),但实际上您希望在组框坐标处绘制矩形

其次,我相信子控件,因为它是一个单独的HWND,将出现在父控件的图形上下文的顶部。也就是说,您正在父控件(UserControl)上绘制,但子控件(GroupBox)位于父控件之上,使您的绘制变得模糊

对于这两个问题,解决方案都是获取子控件的图形上下文并将其传递到递归调用中

    public static void HighlightRequiredFields(Control container, Graphics graphics, Boolean isVisible)
    {
        var borderColor = Color.FromArgb(173, 216, 230);
        const ButtonBorderStyle borderStyle = ButtonBorderStyle.Solid;
        const int borderWidth = 3;

        Rectangle rect = default(Rectangle);
        foreach (Control control in container.Controls)
        {
            if (control.Tag is string && control.Tag.ToString() == "required")
            {
                rect = control.Bounds;
                rect.Inflate(3, 3);
                if (isVisible && control.Text.Equals(string.Empty))
                {
                    ControlPaint.DrawBorder(graphics, rect, 
                    borderColor,
                    borderWidth,
                    borderStyle,
                    borderColor,
                    borderWidth,
                    borderStyle,
                    borderColor,
                    borderWidth,
                    borderStyle,
                    borderColor,
                    borderWidth,
                    borderStyle);
                }
                else
                {
                    ControlPaint.DrawBorder(graphics, rect, container.BackColor, ButtonBorderStyle.None);
                }
            }

            if (control.HasChildren)
            {
                foreach (Control ctrl in control.Controls)
                {
                    HighlightRequiredFields(ctrl, graphics, isVisible);
                }
            }
        }
    }