我有一个表单,它显示在通过 Invoke 调用的方法中,因为该方法是从不同的线程调用的。在我需要打开的表单中,我有一个带有 ComboBox 的 UserControl。如果ComboBox.DropDownStyle
是Simple
form.Show爆炸投掷
InvalidOperationException:跨线程操作无效:控件“comboBox1”从创建它的线程以外的线程访问。
如果我将 ComoBox.DropDownStyle 设置为默认值 (DropDown) 我没有问题。
我现在这有点难以理解(甚至相信)所以这里有一个简化的例子来重现它:
- 创建一个新的 winforms 项目。
- 创建两个窗体和一个用户控件。
- 在用户控件中创建一个 ComboBox。
- 在 Form2 中放置一个用户控件的实例。
- 在 Form1 代码中输入:
private Form form;
private delegate void ShowDelegate();
private ShowDelegate showDelegate;
private void Form1_Load(object sender, EventArgs e)
{
showDelegate = Show;
new Thread(Run).Start();
}
private void Run()
{
form = new Form2();
Invoke(showDelegate);
}
private void Show()
{
form.Show();
}
请记住将事件设置为Form1_Load
.
- 运行它并查看它是否正常工作。
- 更改
ComboBox.DropDownStyle
为Simple
并查看它不起作用!
请问这个问题有什么帮助吗?