标签文本即使在使用刷新、失效和 DoEvents 时也不会更新



我的代码被设计为2轴运动系统的控制系统。我有 2 个驱动器,每个驱动器输出其步数。我可以读取设备、更新属性和更新标签的文本字段。但是,它不会更新表单。当我使用消息框时,我可以显示正确的文本值,但不会更新标签。

我很乐意尝试任何建议,但我已经为此斗争了大约 16 个小时,我已经到了我的智慧尽头 - 正如代码中显示的明显矫枉过正/糟糕的编码所证明的那样。我不明白为什么它没有更新。

此外,下面显示的所有版本的手动按钮用于刷新窗体不会更新控件。

方向,建议?

Private Sub PositionChanged(ByVal sender As Object, ByVal e As EventArgs)
If TraverseController.InvokeRequired Then
TraverseController.Invoke(
New EventHandler(Of EventArgs)(AddressOf PositionChanged), sender, e)
Return
End If
'RaiseEvent PropertyChanged(TraverseController, New System.ComponentModel.PropertyChangedEventArgs("Position"))
MessageBox.Show(TraverseController.lblLinearDrivePosDisp.Text)
TraverseController.lblLinearDrivePosDisp.Text = CStr(_position)
Application.DoEvents()
TraverseController.lblLinearDrivePosDisp.ResetBindings()
TraverseController.GBDrivePositionDisp.Refresh()
TraverseController.lblLinearDrivePosDisp.Refresh()
TraverseController.Refresh()
TraverseController.Invalidate()
TraverseController.Update()
Application.DoEvents()
MessageBox.Show(TraverseController.lblLinearDrivePosDisp.Text)
End Sub

假设:TraverseController 是表单的类名。

这看起来像是 VB 默认表单实例问题。 很明显,您正在尝试使用检查TraverseController.InvokeRequired将控制交互正确封送回 UI 线程。 但是,由于创建这些默认实例的方式,TraverseController.InvokeRequired将在辅助线程上创建一个新的TraverseController实例,并且所有后续代码都在修改该实例,而不是在 UI 线程上创建的实例。

处理此问题的一种方法是将同步控件实例传递给定义PositionChanged更改方法的类,并检查该控件的InvokeRequired方法而不是TraverseController.InvokeRequired。 如果包含类本身是 UI 控件,则使用该类实例 (Me.InvokeRequired(。

最新更新