首页 > 解决方案 > 如何更新另一个线程上的控件?

问题描述

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

当我单击它时,我想要一个 MyNewClass 的新实例以使 Picturebox 出现在我的表单上。

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 方法将初始化的图片框添加到 Form1 控件:

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

但是当我单击 Button1 时,出现异常:
Invoke or BeginInvoke cannot be called on a control until the window handle has been created

感谢您的帮助

标签: .netvb.netmultithreadinguser-interfaceinstance

解决方案


Problem is that YourNewClass doesn't know Form1 as you expected. You must introduce it in global variable. This Code will work:

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

推荐阅读