如何从TextBox TextChanged事件调用OnPaint事件

本文关键字:事件 调用 OnPaint TextChanged TextBox | 更新日期: 2023-09-27 18:30:06

我有一个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事件只被调用一次。

如何从TextBox TextChanged事件调用OnPaint事件

使用Control.Invalidate()方法强制重新绘制控件。

Invalidate()将控件标记为窗口的当前更新区域,该区域将在接收到下一条WM_PAINT消息时重新绘制。这可能会更早或更晚,所以可能不会总是达到你想要的效果。

Update()发送此WM_PAINT消息,并且还绕过消息queque,因此您可能希望使用Invalidate()Update()的组合来始终获得您希望的结果。

为了更容易,只需调用Refresh(),因为这将同步为您执行Invalidate()Update()