我在应用程序中有一个用户表单。某些字段已经过验证。如果字段值错误,则为此控件绘制红色边框。它是通过处理此控件的Paint
事件来完成的。我将TextField
和DateTimePicker
扩展为从这些类对象中获取Paint
事件。我对NumericUpDown
课有疑问。它会正确触发Paint
事件,但会调用
ControlPaint.DrawBorder(e.Graphics, eClipRectangle, Color.Red, ButtonBorderStyle.Solid);
什么都不做。任何想法或建议?如果我找不到任何方法,我会添加一个面板来保持NumericUpDown
控件,我将更改其背景颜色。
每次处理程序都连接到Paint
事件时,我会调用control.Invalidate()
来重新绘制它。
答案 0 :(得分:4)
试试这个:
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。您的有效性检查可能会有所不同,但这对我有用。如果新值不在定义的有效值中,它会在整个NumbericUpDown周围绘制一个红色边框。
诀窍是确保在调用base.OnPaint后进行边框绘制。否则边界将被拉过来。从NumericUpDown继承而不是分配给它的paint事件可能更好,因为重写OnPaint方法可以完全控制绘画的顺序。