8

メインフォームから次のように呼び出して、新しいフォームを開きます

MyForm sth = new MyForm();
sth.show();

すべてがうまく機能しますが、このフォームにはコンボボックスがあり、AutoCompleteModeを提案して追加するように切り替えると、フォームの表示中にこの例外が発生しました。

OLE呼び出しを行う前に、現在のスレッドをシングルスレッドアパートメント(STA)モードに設定する必要があります。Main関数にSTAThreadAttributeがマークされていることを確認してください。

例外の要求に応じて、メイン関数にこの属性を設定しました。

[STAThread]
static void Main(string[] args)
{ ...

何が悪いのかを理解するために助けを求めてもらえますか?

サンプルコード:

private void mainFormButtonCLick (object sender, EventArgs e)
{
    // System.Threading.Thread.CurrentThread.SetApartmentState(ApartmentState.STA); ?
    MyForm form = new MyForm();
    form.show();
}

デザイナー:

this.myCombo.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
this.myCombo.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.myCombo.FormattingEnabled = true;
this.myCombo.Location = new System.Drawing.Point(20, 12);
this.myCombo.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.myCombo.Name = "myCombo";
this.myCombo.Size = new System.Drawing.Size(430, 28);
this.myCombo.Sorted = true;
this.myCombo.TabIndex = 0; phrase";

データソースの設定

public MyForm(List<string> elem)
{
    InitializeComponent();
    populateColorsComboBox();
    PopulateComboBox(elem);
}

public void PopulateComboBox(List<string> list )
{
    this.myCombo.DataSource = null;
    this.myCombo.DisplayMember = "text";
    this.myCombo.DataSource = list;
}
4

3 に答える 3

3

本当にMain(string[] args)あなたのエントリーポイントですか?

たぶん、パラメータのない別のMain()オーバーロードがあります。または、別のクラスの他のMain()。プロジェクトのプロパティを開き、開始オブジェクトを探してください。

于 2012-11-30T11:55:00.973 に答える
2

Windowsフォームアプリケーションは、STAメソッドで実行する必要があります。

こちらをご覧ください:STAとMTAについて説明していただけますか?

また、コントロール自体がネイティブのWindowsハンドルを使用し、STAモデルに準拠する必要があるため、Windowsフォームが機能するため、COMが機能します。この特定の場所でエラーが発生する理由は、オートコンプリートによって2番目のスレッドが内部で作成/使用されているためだと思います。

そして、私が経験した限りでは、スレッドモデルはメインで設定する必要があります。後で変更すると、STAからMTAにのみ機能し、その逆は機能しません。

于 2012-11-30T11:32:57.027 に答える
1

ワイルドソーツとして:2番目のフォームでソースリストのディープコピーを作成し、コンボボックスを元のリストではなくリストのコピーにバインドします。

于 2012-11-30T10:47:47.427 に答える