2013-11-25 4 views
1

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

Current thread must be set to single thread apartment (STA) mode before OLE 

    calls can be made. Ensure that your Main function has STAThreadAttribute 

    marked on it. This exception is only raised if a debugger is attached to the 

    process. 

Th решение вышеуказанной проблемы, как поясняется на другие вопросы, чтобы отметить метод Main() как [STA Thread] но это уже есть в моем случае. Итак, как я могу исправить эту проблему?
Как я звоню диалог мое это: -

private void RightClickMenuClicked(object sender, ToolStripItemClickedEventArgs e) 
    { 
     if (e.ClickedItem.ToString() == "Copy") 
     { 
      FolderBrowsing.ShowDialog() ; 
      // Do other stuff here .... 
     } 
    } 
+0

Можете ли вы опубликовать какой-то код о том, как вы это делаете? – Szymon

+0

@ Шимон Я разместил часть кода. –

ответ

0

Я не знаю, как вы вызываете метод ShowDialog. Вы можете попробовать этот код

private DialogResult STAShowDialog(FolderBrowserDialog dialog) 
    { 
     DialogState state = new DialogState(); 
     state.dialog = dialog; 
     System.Threading.Thread t = new 
       System.Threading.Thread(state.ThreadProcShowDialog); 
     t.SetApartmentState(System.Threading.ApartmentState.STA); 
     t.Start(); 
     t.Join(); 
     return state.result; 
    } 

    public class DialogState 
    { 
     public DialogResult result; 
     public FolderBrowserDialog dialog; 


     public void ThreadProcShowDialog() 
     { 
     result = dialog.ShowDialog(); 
     } 
    } 

и в вашей кнопки мыши или где-то можно попробовать

 private void button1_Click(object sender, EventArgs e) 
    { 
     FolderBrowserDialog _myfolderDialog= new FolderBrowserDialog(); 
     frm.InitializeLifetimeService(); 


     DialogResult _result= STAShowDialog(_myfolderDialog); 
     if (result== DialogResult.OK) 
     { 
      //Do your stuff 
     } 
    } 
2

В Windows Forms или WPF, пользовательский интерфейс может работать только в одном потоке . Вы должны добавить свое дополнительное окно в Dispatcher с помощью метода Invoke - это заставит поток пользовательского интерфейса работать с ним. (Подход Кайла немного похож)

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