0

Invokeを介して呼び出されたメソッドに表示されるフォームがあります。これは、そのメソッドが別のスレッドから呼び出されているためです。開く必要のあるフォームに、ComboBoxを含むUserControlがあります。がフォームの場合、ショーComboBox.DropDownStyleSimpleスローを爆発させます

InvalidOperationException:クロススレッド操作が無効です:コントロール'comboBox1'は、それが作成されたスレッド以外のスレッドからアクセスされました。

ComoBox.DropDownStyleをデフォルト値(DropDown)に設定すれば、問題はありません。

私は今、これを理解するのは難しい(信じる)ので、ここにそれを再現するための簡単な例があります:

  1. 新しいwinformsプロジェクトを作成します。
  2. 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.DropDownStyleて、Simple機能しないことを確認してください。

この問題について何か助けがありますか?

4

1 に答える 1

2

動かすだけで

form = new Form2();

Show()メソッドに対しては、それが機能します。

フォームは開始したスレッドで初期化され、その後機能します。しかし、あなたは長期的に行動をチェックしたいかもしれません...

于 2012-05-04T17:33:29.267 に答える