1

我正在尝试更改在 Visual Basic 中的 Do While 循环的每次迭代期间标签显示的文本。一个标签(显示一个整数)工作正常,但另一个标签保持空白,直到循环完成并显示最终结果。可能是什么问题呢?

Private Sub btnCalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnOblicz.Click
Dim W As Single
Dim L As Integer
Dim J As Integer
Dim Y As Double

W = Val(txtW.Text)

L = InputBox("Input L")

J = 0

If W > 0 And W < 100 Then

Do

    Y = (2 * Math.Sqrt(W)) / (L - J)
    J = J + 1
    lblJ.Text = Str(J)
    lblY.Text = Str(Y)
    MsgBox("Next...")

Loop Until Y < 0

Else
    MsgBox("No calculations, because the number is less than zero or greater than a hundred.")

End If

End Sub
4

3 回答 3

5

正如其他人所建议的那样,Application.DoEvents() 可以工作。但是,您应该知道它有一些负面影响,例如可能会创建 StackOverflowExceptions。

解决这个问题的正确方法是使用BackgroundWorker 组件

至于为什么会发生这种情况……请记住,所有 Windows 程序的工作原理都是通过一个循环来检查来自用户和操作系统的消息(例如鼠标移动事件、单击、击键等)。当您设置标签的文本属性时,您并没有告诉标签在屏幕上重新绘制自己。相反,您正在向操作系统发布一个事件,然后您的程序的消息循环必须接收并处理该事件。随着新事件的出现,消息循环(或泵)将这些事件发送到正确的方法。

您的btnCalc_Click()功能就是这样一种方法。如果您的函数正在运行,它是由核心 Windows 消息传递循环调用的,该循环现在正在等待您的方法完成并返回控制:它已被阻止。在您的函数完成之前,循环无法继续接收和分派方法,因此您的程序界面中的任何内容都无法更新。

于 2012-04-18T14:48:51.130 回答
1

在我使用 VS2010 所做的小副本中,这对我来说效果很好

可能需要消息泵。尝试这个 :

System.Windows.Forms.Application.DoEvents()

于 2012-04-18T14:21:15.243 回答
0

可能,在您的循环执行时,您处理操作系统事件消息的窗口函数是不可访问的。尝试显式调用调度消息。例如,在循环内分配标签文本后插入

Application.DoEvents
于 2012-04-18T14:18:49.247 回答