Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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# 为NumericUpDown绘制边框_C#_Winforms_.net 4.0 - Fatal编程技术网

C# 为NumericUpDown绘制边框

C# 为NumericUpDown绘制边框,c#,winforms,.net-4.0,C#,Winforms,.net 4.0,我在申请中有一个用户表单。一些字段已验证。如果字段的值错误,将为此控件绘制红色边框。它是通过处理此控件的Paint事件来实现的。我扩展了TextField和DateTimePicker以从这些类对象中获取Paint事件。我对NumericUpDown类有问题。它确实正确地触发绘制事件,但调用 ControlPaint.DrawBorder(e.Graphics, eClipRectangle, Color.Red, ButtonBorderStyle.Solid); 什么都不做。有什么想法或建

我在申请中有一个用户表单。一些字段已验证。如果字段的值错误,将为此控件绘制红色边框。它是通过处理此控件的
Paint
事件来实现的。我扩展了
TextField
DateTimePicker
以从这些类对象中获取
Paint
事件。我对
NumericUpDown
类有问题。它确实正确地触发
绘制
事件,但调用

ControlPaint.DrawBorder(e.Graphics, eClipRectangle, Color.Red, ButtonBorderStyle.Solid);
什么都不做。有什么想法或建议吗?如果我找不到任何方法,我将添加一个面板来按住
NumericUpDown
控件,并更改其背景颜色

每次处理程序连接到
Paint
事件时,我调用
control.Invalidate()
重新绘制它。

尝试以下操作:

public class NumericUpDownEx : NumericUpDown
{
    bool isValid = true;
    int[] validValues = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        if (!isValid)
        {
            ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Red, ButtonBorderStyle.Solid);
        }
    }

    protected override void OnValueChanged(System.EventArgs e)
    {
        base.OnValueChanged(e);

        isValid = validValues.Contains((int)this.Value);
        this.Invalidate();
    }
}
假设您的值是int类型而不是decimal。您的有效性检查可能会有所不同,但这对我很有效。如果新值不在定义的有效值中,它将在整个NumberUpDown周围绘制一个红色边框

诀窍是确保在调用base.OnPaint后进行边界绘制。否则,边界将被划定。从NumericUpDown继承可能比指定给其绘制事件更好,因为重写OnPaint方法可以完全控制绘制顺序。

尝试以下操作:

public class NumericUpDownEx : NumericUpDown
{
    bool isValid = true;
    int[] validValues = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        if (!isValid)
        {
            ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Red, ButtonBorderStyle.Solid);
        }
    }

    protected override void OnValueChanged(System.EventArgs e)
    {
        base.OnValueChanged(e);

        isValid = validValues.Contains((int)this.Value);
        this.Invalidate();
    }
}
假设您的值是int类型而不是decimal。您的有效性检查可能会有所不同,但这对我很有效。如果新值不在定义的有效值中,它将在整个NumberUpDown周围绘制一个红色边框


诀窍是确保在调用base.OnPaint后进行边界绘制。否则,边界将被划定。从NumericUpDown继承可能比指定给其绘制事件更好,因为重写OnPaint方法可以完全控制绘制顺序。

您解决了这个问题吗?您解决了这个问题吗?我试图在不扩展
NumericUpDown
类的情况下实现它。谢谢你的帮助。我的扩展类不包含使其更灵活的验证方法。我使用setters中的
Invalidate()
invoke为颜色和边框样式添加了属性。实际上,我可以制作
delegate
及其实例字段,让所有者向该控件添加验证器。我试图在不扩展
NumericUpDown
类的情况下实现它。谢谢你的帮助。我的扩展类不包含使其更灵活的验证方法。我使用setters中的
Invalidate()
invoke为颜色和边框样式添加了属性。实际上,我可以制作
委托
及其实例字段,让所有者向该控件添加验证器。