我有一个textBox textchanged事件:
private void anyTextBox_TextChanged(object sender, EventArgs e)
{
btnUpload.Enabled = txtHost.TextLength > 0 && txtUploadFile.TextLength > 0;
}
我有一个onPaint事件:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Pen penBorder = new Pen(Color.Red, 3);
if (btnUpload.Enabled == false)
{
e.Graphics.DrawRectangle(penBorder, txtHost.Location.X, txtHost.Location.Y,
txtHost.Width - 1, txtHost.Height - 1);
e.Graphics.DrawRectangle(penBorder, txtUploadFile.Location.X, txtUploadFile.Location.Y,
txtUploadFile.Width - 1, txtUploadFile.Height - 1);
}
}
但是现在当我在其中一个文本框中键入文本时,根据哪个文本框删除它周围的红色矩形,如果两个带有文本的文本框都删除了它们周围的红色矩形。
问题是当我运行程序时,OnPaint事件只被调用一次。
使用Control.Invalidate()
方法强制重绘控件。
Invalidate()
将控件标记为窗口的当前更新区域,当收到下一个WM_PAINT
消息时,该区域将被重新绘制。这可能是更早或更晚,因此它可能并不总是具有您想要的效果。
Update()
发送此WM_PAINT
消息并绕过消息队列,因此您可能希望使用Invalidate()
和Update()
的组合来始终获得您希望的结果。
为了方便起见,只需调用Refresh()
,因为这将同步为您执行Invalidate()
和Update()
。