0

我有一个表单,它显示在通过 Invoke 调用的方法中,因为该方法是从不同的线程调用的。在我需要打开的表单中,我有一个带有 ComboBox 的 UserControl。如果ComboBox.DropDownStyleSimpleform.Show爆炸投掷

InvalidOperationException:跨线程操作无效:控件“comboBox1”从创建它的线程以外的线程访问。

如果我将 ComoBox.DropDownStyle 设置为默认值 (DropDown) 我没有问题。

我现在这有点难以理解(甚至相信)所以这里有一个简化的例子来重现它:

  1. 创建一个新的 winforms 项目。
  2. 创建两个窗体和一个用户控件。
  3. 在用户控件中创建一个 ComboBox。
  4. 在 Form2 中放置一个用户控件的实例。
  5. 在 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.

  1. 运行它并查看它是否正常工作。
  2. 更改ComboBox.DropDownStyleSimple并查看它不起作用!

请问这个问题有什么帮助吗?

4

1 回答 1

2

By simply moving

form = new Form2();

To your Show() method, it will work then.

The Form gets initialized on the thread you start, it works then. But you might want to check the behavior in the long term ...

于 2012-05-04T17:33:29.267 回答