Текст метки не обновляется даже при использовании Refresh, Invalidate и DoEvents - PullRequest
0 голосов
/ 01 октября 2019

Мой код предназначен для системы управления 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

1 Ответ

0 голосов
/ 01 октября 2019

Предположение: TraverseController - это имя класса формы.

Это похоже на проблему с экземпляром формы VB по умолчанию. Очевидно, что вы пытаетесь правильно перенаправить управление взаимодействием обратно в поток пользовательского интерфейса с помощью проверки TraverseController.InvokeRequired. Однако из-за способа создания экземпляра по умолчанию TraverseController.InvokeRequired создает новый экземпляр TraverseController во вторичном потоке, и весь последующий код изменяет этот экземпляр, а не тот, который создан в потоке пользовательского интерфейса.

Один из способов справиться с этим - передать экземпляр синхронизирующего элемента управления в класс, в котором определен PositionChanged измененный метод, и проверить метод InvokeRequired этого элемента управления вместо TraverseController.InvokeRequired. Если содержащий класс сам является элементом управления пользовательского интерфейса, используйте этот экземпляр класса (Me.InvokeRequired).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...