2012-11-27 1 views
8

С моей MainForm я называю следующее, чтобы открыть новую формуSingle нить вопрос квартиру

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

Все прекрасно работает, однако эта форма имеет выпадающий, что, когда я включаю его AutoCompleteMode предложить и добавить, я получил это исключение при показе формы:

Текущий поток должен быть установлен в режим однопоточной квартиры (STA) до того, как вызовы OLE могут быть выполнены. Убедитесь, что ваша основная функция имеет 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; 
} 
+0

Что делать, если вы очищаете и перестраиваете проект? –

+0

Вы видели этот похожий [вопрос] (http://stackoverflow.com/questions/4685237/how-can-i-make-a-background-worker-thread-set-to-single-thread-apartment)? – Cdeez

+0

Как вы показываете форму? В пределах основной нити или разделенной нити? –

ответ

3

ли Main(string[] args) действительно точка входа?

Возможно, у вас есть другая перегрузка Main() без параметров. Или некоторые другие Main() в другом классе. Откройте свойства проекта и найдите начальный объект.

1

В дикой мысли: создать глубокую копию списка источника в вашей второй форме и привяжите поле со списком к копии списка, а не оригиналу.

2

Приложения Windows Forms должны запускаться в методе STA.

Смотрите здесь: Could you explain STA and MTA?

И COM входит в игру, так как окна формы в игру вступает так как элементы управления сами использовать собственные окна ручки и, таким образом, должны придерживаться модели STA. Я верю, что причина, по которой вы получаете ошибку в этом конкретном месте, состоит в том, что второй поток создается/используется внутренним путем автозаполнения.

И насколько я expereienced, потоковая модель должна быть установлена ​​в Main, меняя позже работает только от ГНА в MTA, но не наоборот

Смежные вопросы