“跨线程操作无效”,如果 ComboBox.DropDownStyle == 简单

本文关键字:如果 ComboBox DropDownStyle 简单 线程 操作 无效 | 更新日期: 2023-09-27 18:33:08

我有一个表单,它显示在通过 Invoke 调用的方法中,因为该方法是从不同的线程调用的。在我需要打开的表单中,我有一个带有组合框的用户控件。如果ComboBox.DropDownStyle Simple窗体。表演爆炸投掷

无效操作

异常:跨线程操作无效:控制 "comboBox1"从它所在的线程以外的线程访问 创建于。

如果我在默认值(DropDown(中设置ComoBox.DropDownStyle,我没有问题。

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

  1. 创建一个新的 winforms 项目。
  2. 创建两个窗体和一个用户控件。
  3. 在用户控件中创建一个组合框。
  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.DropDownStyle更改为Simple,然后看到它不起作用!

请对此问题提供任何帮助?

“跨线程操作无效”,如果 ComboBox.DropDownStyle == 简单

只需移动

form = new Form2();

对于您的 Show(( 方法,它将起作用。

表单在您启动的线程上初始化,然后它就可以工作了。但是您可能希望长期检查行为...