.net - 如何更新另一个线程上的控件?
问题描述
这是我的情况,我的表单上有一个按钮。
当我单击它时,我想要一个 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
感谢您的帮助
解决方案
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
推荐阅读
- java - 从 java 中的 Futures 列表中收集结果
- javascript - 使用 Capacitor 插件作为脚本包含(不使用包/模块加载器)
- ubuntu - 错误:在 Ubuntu 启动时找不到符号“grub_calloc”
- r - 对于 r -trouble 中的循环问题
- javascript - ESP8266 网络服务器
- r - Nelson Aalen 在老鼠身上的估计
- c# - DuplicateMappingException:添加程序集时重复集合角色映射
- javascript - 合并两个 json 数组,同时更新它们的内容
- php - 使用 substr 获取前 x 个字符时如何跳过 HTML 标记
- javascript - 在 React Native 中并排显示图像和文本