Vb.net Label.Text不';不要在循环中改变

Vb.net Label.Text不';不要在循环中改变,vb.net,winforms,Vb.net,Winforms,我正在尝试更改标签在VisualBasic中DoWhile循环的每次迭代中显示的文本。一个标签(显示整数)可以正常工作,但另一个标签保持空白,直到循环完成并显示最终结果。有什么问题吗 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 Intege

我正在尝试更改标签在VisualBasic中DoWhile循环的每次迭代中显示的文本。一个标签(显示整数)可以正常工作,但另一个标签保持空白,直到循环完成并显示最终结果。有什么问题吗

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
Private Sub btnCalc\u单击(ByVal sender作为System.Object,ByVal e作为System.EventArgs)
处理btnOblicz。单击
暗W为单色
作为整数的Dim L
作为整数的Dim J
双色
W=Val(txtW.Text)
L=输入框(“输入L”)
J=0
如果W>0且W<100,则
做
Y=(2*Math.Sqrt(W))/(L-J)
J=J+1
lblJ.Text=Str(J)
lblY.Text=Str(Y)
MsgBox(“下一个…”)
循环直到Y<0
其他的
MsgBox(“无计算,因为数字小于零或大于100。”)
如果结束
端接头

当循环执行时,处理操作系统事件消息的窗口函数可能无法使用。尝试显式调用调度消息。例如,在循环中指定标签文本后插入

Application.DoEvents

当循环执行时,处理操作系统事件消息的窗口函数可能不可用。尝试显式调用调度消息。例如,在循环中指定标签文本后插入

Application.DoEvents

这在我使用VS2010制作的小拷贝中非常有效

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


System.Windows.Forms.Application.DoEvents()

这在我使用VS2010制作的小拷贝中运行良好

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

System.Windows.Forms.Application.DoEvents()

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

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

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

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

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

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

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


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

Ha刚才看到了这一点,我在看到你的答案之前键入了我的答案,我们的想法相似SirHa刚才看到了这一点,我在看到你的答案之前键入了我的答案,我们的想法相似,先生