如何更新另一个线程上的控件



这是我的情况,我的表单上有一个按钮。

当我点击它时,我希望MyNewClass的一个新实例能在我的表单上显示一个图片框。

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim fooThread As New Threading.Thread(Sub() Foo())
fooThread.Start()
End Sub
Private Sub Foo()
Dim myInstance = New MyNewClass()
End Sub
End Class
Public Class MyNewClass
Public Sub New()
Dim testControl = New PictureBox()
testControl.BackColor = Color.Green
Form1.Controls.Add(testControl)
End Sub
End Class

问题是,当我点击按钮时,什么都没有出现

我尝试使用Invoke方法将初始化的picturebox添加到Form1控件:

Form1.Invoke(Sub() Form1.Controls.Add(testControl))

但是当我点击按钮1时,我得到一个异常:
Invoke or BeginInvoke cannot be called on a control until the window handle has been created

感谢您帮助

问题是YourNewClass并不像您预期的那样知道Form1。您必须在全局变量中引入它。此代码将起作用:

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MyForm = Me
Dim fooThread As New Threading.Thread(Sub() Foo())
fooThread.Start()
End Sub
Private Sub Foo()
Dim myInstance = New MyNewClass()
End Sub
End Class
Public Class MyNewClass
Public Sub New()
Dim testControl = New PictureBox()
testControl.BackColor = Color.Green
MyForm.Invoke(Sub() MyForm.Controls.Add(testControl))
End Sub
End Class
Public Module Module1
Public MyForm As Form
End Module

最新更新