标签文本即使在使用刷新,无效和DoEvent时也不会更新

问题描述 投票:0回答:1

我的代码被设计为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
vb.net forms label
1个回答
0
投票

假设:TraverseController是表单的类名。

这看起来像是VB默认表单实例问题。显然,您正在尝试通过使用TraverseController.InvokeRequired来将控制交互正确地编组回UI线程。但是,由于这些默认实例的创建方式,TraverseController.InvokeRequired在辅助线程上创建了TraverseController的新实例,所有后续代码都在修改该实例,而不是在UI线程上创建的实例。

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

© www.soinside.com 2019 - 2024. All rights reserved.