Label.Text 不会在循环中更改

pmi*_*hna 1 vb.net winforms

我正在尝试更改在 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
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 5

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

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

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

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