为NumericUpDown绘制边框

本文关键字:边框 绘制 NumericUpDown | 更新日期: 2023-09-27 17:57:48

我在应用程序中有一个用户表单。某些字段已验证。如果字段的值错误,将为此控件绘制红色边框。它是通过处理此控件的Paint事件而生成的。我扩展了TextFieldDateTimePicker以从这些类对象中获得Paint事件。我对NumericUpDown课有意见。它确实正确地激发了Paint事件,但调用了

ControlPaint.DrawBorder(e.Graphics, eClipRectangle, Color.Red, ButtonBorderStyle.Solid);

什么都不做。有什么想法或建议吗?如果我找不到任何方法,我会添加一个面板来控制NumericUpDown,并更改其背景颜色。

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

为NumericUpDown绘制边框

试试这个:

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类型。你的有效性检查可能会有所不同,但这对我来说很有效。如果新值不在定义的有效值中,它会在整个NumericUpDown周围画一个红色边框。

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