无法将一个Thread的控件添加到另一个线程的Control中

时间:2013-09-09 09:14:59

标签: vb.net multithreading winforms controls

我知道有很多关于这个问题的帖子,但我无法解决这个问题。

我正在开发基于vb.NET表单的应用程序。我正在尝试向Tabcontrol添加一个控件。要添加到tabcontrol的控件位于不同的项目中。 Tabcontrol是第三方(Infragistics)控件,与.NET Tabcontrol相同,具有一些额外功能。 下面是我将控件添加到Tabcontrol的代码行。

fViewerForm.DocumentViewer1.ThumbnailPane.TabControl.Tabs(tnp_PageTab_ID).TabPage.Controls.Add(fViewerForm.DocumentViewer1.ThumbnailPane.TNViewer1.TNImage(0)) 

控制 TnImage(0)是一个userControl,位于一些不同的项目中。  我收到以下错误: “在一个线程上创建的控件不能作为另一个线程上的控件的父级。”

经过几篇文章后,我发现调用方法可用于解决此类问题。所以我修改了我的代码:

 fViewerForm.DocumentViewer1.ThumbnailPane.AddControlToTabControl(tnp_PageTab_ID, fViewerForm.DocumentViewer1.ThumbnailPane.TNViewer1.TNImage(0))

 Delegate Sub AddControlToTabControlCallback(ByVal key As String, ByVal tnimage As UeWIImageX.UeWIImage)

  Public Sub AddControlToTabControl(ByVal key As String, ByVal tnimage As UeWIImageX.UeWIImage)

     ' Calling from another thread? -> Use delegate.
    If Me.TabControl1.InvokeRequired Then
         Dim d As New AddControlToTabControlCallback(AddressOf AddControlToTabControl)

      ' Execute delegate in the UI thread, pass args as an array.
        Me.TabControl1.Invoke(d, New Object() {key, tnimage})

    Else ' Same thread.
           Me.TabControl1.Tabs(key).TabPage.Controls.Add(tnimage)

    End If
   End Sub

之后我也得到同样的错误。如果我在 AddControlToTabControl 方法中创建相同的控件,那么我可以将该控件添加到 Tabcontrol 。以下是代码:

Public Sub AddControlToTabControl(ByVal key As String, ByVal tnimage As UeWIImageX.UeWIImage)

     ' Calling from another thread? -> Use delegate.
    If Me.TabControl1.InvokeRequired Then
         Dim d As New AddControlToTabControlCallback(AddressOf AddControlToTabControl)

      ' Execute delegate in the UI thread, pass args as an array.
        Me.TabControl1.Invoke(d, New Object() {key, tnimage})

    Else ' Same thread.
         Dim uewimg As New UeWIImageX.UeWIImage  ' creating the same control as tnimage.
             uewimg = tnimage 
           Me.TabControl1.Tabs(key).TabPage.Controls.Add(uewimg) 'able to add this control to the tabcontrol.

    End If
   End Sub

如何对 TnImage 控件使用Invoke方法,以便我可以将其添加到Tabcontrol。请有人帮助我。

0 个答案:

没有答案