我正在尝试更改标签在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
答案 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