Label.Text在循环中不会改变

时间:2012-04-18 14:14:21

标签: 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

3 个答案:

答案 0 :(得分:4)

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

正确解决此问题的方法是使用BackgroundWorker component

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

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

答案 1 :(得分:1)

这对我来说很好用我使用VS2010的小副本

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

System.Windows.Forms.Application.DoEvents()

答案 2 :(得分:0)

可能在执行循环时,处理OS事件消息的窗口函数无法访问。尝试显式调用调度消息。例如。在循环中分配标签文本后插入

Application.DoEvents