Invokeを介して呼び出されたメソッドに表示されるフォームがあります。これは、そのメソッドが別のスレッドから呼び出されているためです。開く必要のあるフォームに、ComboBoxを含むUserControlがあります。がフォームの場合、ショーComboBox.DropDownStyle
はSimple
スローを爆発させます
InvalidOperationException:クロススレッド操作が無効です:コントロール'comboBox1'は、それが作成されたスレッド以外のスレッドからアクセスされました。
ComoBox.DropDownStyleをデフォルト値(DropDown)に設定すれば、問題はありません。
私は今、これを理解するのは難しい(信じる)ので、ここにそれを再現するための簡単な例があります:
- 新しいwinformsプロジェクトを作成します。
- 2つのフォームとユーザーコントロールを作成します。
- ユーザーコントロールで、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
機能しないことを確認してください。
この問題について何か助けがありますか?