如何在C#中关闭MessageBox后强制按钮,TextBoxes在窗体上重绘

时间:2009-01-13 17:38:55

标签: c# winforms

我有一个带有按钮,textBoxes和userControls的表单。单击按钮时,它会调用另一个类中的方法。在此类中,将打开一个消息框。当用户单击“确定”时,messageBox将关闭,并且类方法将在结束前持续10秒左右。在这10秒钟内,消息框上的textBox或按钮仍显示messageBox(它们没有重新绘制)。

问题是我如何强制在表格上重绘一切。问题是具有messageBox的类没有任何关于调用它的表单的知识

5 个答案:

答案 0 :(得分:8)

您可以尝试使用

Application.DoEvents()
消息框关闭后

。但是 - 除非您在后台线程中执行您在其他类中调用的方法 - 否则您的UI将无法响应10秒。

答案 1 :(得分:6)

完全在UI中完成工作需要10秒吗?如果没有,它应该在一个单独的线程上完成。即使你自己刷新表单,你仍然会在10秒内没有响应的UI,这是不理想的。

有关在不同线程中执行代码并回调UI线程的示例,请参阅my threading tutorial。请注意,这是“旧的”做事方式 - BackgroundWorker使事情变得更简单。

答案 2 :(得分:3)

这里的问题是您在UI线程上进行了处理并阻止了绘制消息。调用Refresh或Invalidate不会解决这个问题,因为你仍在阻塞执行这些操作的线程。

相反,你应该进行处理并将其移动到另一个线程,然后在后台线程上执行工作时更新你的UI线程(适当地,通过Invoke方法,更有可能)。

答案 3 :(得分:0)

要强制重绘所有内容,可以在主窗体上调用Invalidate()。

答案 4 :(得分:0)

您的问题是您正在UI线程上工作。在您的方法返回之前,UI不会重新绘制,这将允许Windows消息循环继续。

解决方案是在不同的线程上运行您的工作方法。也许BackgroundWorker类可以很好地解决您的问题。

编辑: 请参阅此文章以获得深入解释:
http://www.yoda.arachsys.com/csharp/threads/winforms.shtml