2015-01-26 3 views
-1
Private Sub FormStatusUpdate(Serverconnectionstatus as boolean) 
     If ServerConnectionStatus = True Then 
     Try 
      ' Enable Download/Upload/Sync Icon in Form 
      For Each OpenedForms As Form In My.Application.OpenForms 
       If Not TypeOf OpenedForms Is SplashScreen1 And Not TypeOf OpenedForms Is GroupOper Then 
        If OpenedForms.Text.EndsWith(")") Or OpenedForms.Text.EndsWith("*") Then 
         For Each ts_obj As ToolStrip In OpenedForms.Controls.OfType(Of ToolStrip)() 
          Dim btn_Updates1 = ts_obj.Items.Find("Download", True) 
          If btn_Updates1.Length > 0 Then 
           DirectCast(btn_Updates1(0), ToolStripItem).Enabled = True 
          End If 
          Dim btn_Updates2 = ts_obj.Items.Find("tsSync", True) 
          If btn_Updates2.Length > 0 Then 
           DirectCast(btn_Updates2(0), ToolStripItem).Enabled = True 
          End If 
          Dim btn_Updates3 = ts_obj.Items.Find("Upload", True) 
          If btn_Updates3.Length > 0 Then 
           DirectCast(btn_Updates3(0), ToolStripItem).Enabled = True 
          End If 
         Next 
        End If 
       ElseIf TypeOf OpenedForms Is GroupOper Then 
        For Each gd_obj As Control In OpenedForms.Controls 
         If gd_obj.Name = "GoDownload" Or gd_obj.Name = "GoUpload" Then 
          gd_obj.Enabled = True 
         End If 
        Next 
       End If 
      Next.... 

Вопрос: как вызвать элемент управления пользовательского интерфейса, расположенный в подзаголовке?как использовать различные элементы управления пользовательского интерфейса?

Моя основная форма открыла различные подформы во время инициализации. Основная форма называется com-объектом. Объект com ответил в другом потоке. Теперь мне нужно заметить некоторые элементы управления через события com_объекта com_change (Ini_DataGroup_DataChanged). Я знаю, как информировать основной пользовательский интерфейс формы, но не в состоянии определить эти элементы управления в подзаголовке. другими словами, я не уверен, как вызвать эти элементы подформы во время вызова.

здесь COM-объект вызывает функцию.

Private Sub Ini_DataGroup_DataChanged(subscriptionHandle As Object, requestHandle As Object, values() As Opc.Da.ItemValueResult) Handles Ini_DataGroup.DataChanged 
    MsgBox("ERROR") 
    If values(0).Quality.Equals(Opc.Da.Quality.Good) And values(0).Value.ToString = "1" Then 
     OPCConnectionBool = True 
    Else 
     Try 
      OPCConnectionBool = False 
      subscriptionHandle = Nothing 
      OPCNetServer.Disconnect() 
      OPCNetServer = Nothing 
      OfflineNotification.StartPosition = FormStartPosition.CenterScreen 
      OfflineNotification.ShowDialog() 
     Catch ex As Exception 
      Exit Sub 
     End Try 
    End If 

    Call FormStatusUpdate(OPCConnectionBool) ' Update Connection Status 

End Sub 

Очевидно, что бросает исключение говорит: Cross Threads и Controls ошибки и т.д. , потому что COM был создан в другом потоке. Командная строка ts_obj не может управляться вызовом com.

Как я могу решить эту проблему? Благодаря

+0

я уверен, что есть несколько способов это может быть достигнуто в зависимости от как структурирован ваш код. Измените свой вопрос и укажите более подробный код, показывающий, как вы вызываете свои подформы, чтобы мы могли предоставить ответ. –

+0

Вы получаете какие-то исключения? ... или просто не находите целевой контроль? –

ответ

0

Я бы переписать это так:

For Each OpenedForms As Form In My.Application.OpenForms 
     If Not TypeOf OpenedForms Is SplashScreen1 And Not TypeOf OpenedForms Is GroupOper Then 
      If OpenedForms.Text.EndsWith(")") Or OpenedForms.Text.EndsWith("*") Then 
       For Each ts_obj As ToolStrip In OpenedForms.Controls.OfType(Of ToolStrip)() 
        Dim btn_Updates1 = ts_obj.Items.Find("Download", True) 
        If btn_Updates1.Length > 0 Then 
         DirectCast(btn_Updates1(0), ToolStripItem).Enabled = True 
        End If 
       Next 
      End If 
     End If 
    Next 
+0

Большое спасибо. это намного чище. – Steve

0

Вы должны Маршаллу код пользовательского интерфейса на поток пользовательского интерфейса.

Это означает вызов метода Invoke() на одной из ваших форм.

Для доступа к элементам управления на подчиненном от основной формы, я бы разоблачить те элементы управления, с помощью свойств на вспомогательном виде:

Public ReadOnly Property SomeControl As TextBox 
Get 
    Return theTextBox 
End Get 
End Property 
+0

Не совсем уверен, как это реализовать. Основная форма, называемая COM, и COM ответил изменением события данных. для события данных необходимо обновить некоторые элементы управления форматами. К сожалению, эти элементы управления не входят в основную форму, и они расположены в других формах. Я почти не понимаю ваш код, но не знаю, где его добавить. Я действительно ценю твою помощь. – Steve

+0

Может ли кто-нибудь помочь мне здесь? я весьма признателен. – Steve

Смежные вопросы