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

时间:2014-11-11 06:57:48

标签: c# .net winforms

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

Invalidate()标记对窗口当前更新区域的控制,当收到下一条WM_PAINT消息时,该区域将重新绘制。这可能是更早或更晚,因此它可能并不总是具有你想要的效果。

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

为方便起见,只需致电Refresh(),因为这样可以同步Invalidate()Update()