powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / folderBrowserDialog во второй форме
11 сообщений из 11, страница 1 из 1
folderBrowserDialog во второй форме
    #38558016
INFINITs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем, добрый день.
Есть одна формочка, по кнопке открывается вторая формочка с кнопкой по которой надо открыть folderBrowserDialog.

Появляется ошибка во время отладки:
"Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны. Проверьте, что ваша функция Main помечена атрибутом STAThreadAttribute. Данное исключение создается, только если к процессу подключен отладчик."

Если запускать exe то открытый folderBrowserDialog не содержит дерево каталогов, нет возможности выбрать папку. Только нажать ОК или Отмена.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
[STAThreadAttribute]
 static void Main()
{Application.EnableVisualStyles();              
  Application.SetCompatibleTextRenderingDefault(false);              
  Application.Run(new Form_Main());              
}
//кнопка по которой открывается форма
private void mMain_Setting_Click(object sender, EventArgs e)
        {Form_Setting frmSetting = new Form_Setting();                        
         frmSetting.Owner=this; 
         frmSetting.ShowDialog();}

 public partial class Form_Setting : Form
    {              
        public Form_Setting()
        {
            InitializeComponent();
        }
      private void pb_dir_out_Click(object sender, EventArgs e)
        {folderBrowserDialog1.SelectedPath = Directory.GetCurrentDirectory();
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {   
                this.tb_set_dir_out.Text = folderBrowserDialog1.SelectedPath;
            }
         }
 }



Если для открытия folderBrowserDialog1 выделить поток, то вроде все хорошо.
Но тогда я могу пооткрывать таких окошек н-ое количество, что не есть хорошо.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
private void show()
        { folderBrowserDialog1.ShowDialog()
        }
private void pb_dir_out_Click(object sender, EventArgs e)
{Thread tmpThread1 = new Thread(new ThreadStart(show));
 tmpThread1.SetApartmentState(ApartmentState.STA);
 tmpThread1.Start();
}




Может кто знает нормальный способ это сделать?
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38558125
INFINITs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока остановился,
добавил t.Join(); теперь хоть 5 окошек выбора папки открыть нельзя.
Но если открыть одно окно выбора папки и пока оно открыто понажимать на кнопку открытия данного окна, то после нажатия вокне выбора папок "ОК", данное окно откроется снова столько же раз сколько вы нажимали на кнопку его открытия.

Что мне кажется не особо верным.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private string Show_Dialog()
        {
            string v_selectedPath="";
            var t = new Thread((ThreadStart)(() =>
            {
                FolderBrowserDialog fbd = new FolderBrowserDialog();
                fbd.SelectedPath = Directory.GetCurrentDirectory();
                fbd.ShowNewFolderButton = true;
                if (fbd.ShowDialog() == DialogResult.Cancel)
                return;
                v_selectedPath = fbd.SelectedPath;
            }));
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
            t.Join();
            return v_selectedPath;
        }
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38558780
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INFINITsМожет кто знает нормальный способ это сделать?
Открывать в разных потоках формы - это не верно в принципе.
Может у вас просто настройки перед запуском диалога не верны?
Зачем вы пытаетесь сразу дать диалоговому окну какой-то каталог?
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38558785
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INFINITs,

Код: c#
1.
2.
3.
FolderBrowserDialog folderSearch = new FolderBrowserDialog();
folderSearch.RootFolder = Environment.SpecialFolder.ProgramFiles;
folderSearch.ShowDialog();



Вот например... все видно, все листается....
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38558888
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INFINITs, приведенный в первом сообщении код работает у меня без ошибок. У тебя точно больше нет потоков в приложении? Может ты используешь System.Threading.Timer который создает собственный поток или что-то еще.

D129Зачем вы пытаетесь сразу дать диалоговому окну какой-то каталог?
Для удобства пользователя, видимо, чтобы сразу попадать в ранее выбранный каталог.
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38559228
INFINITs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129 Может у вас просто настройки перед запуском диалога не верны?
Зачем вы пытаетесь сразу дать диалоговому окну какой-то каталог?


Какие настройки могут быть неверны?
Как сказал, bazile , это для удобства пользователя. Ради интереса удалил не помогло.


bazileINFINITs, приведенный в первом сообщении код работает у меня без ошибок. У тебя точно больше нет потоков в приложении? Может ты используешь System.Threading.Timer который создает собственный поток или что-то еще.

На форме есть компонента System.Threading.Timer, но сам таймер не запущен.
Впринципе удалил для теста компоненту не помогло.

Беглый просмотр инета говорит, что для открытия второй формы в диалоговом формате, выделяется еще один поток и из-за этого потом я не могу открыть на ней folderBrowserDialog.

Если кинуть folderBrowserDialog на основную форму, то все ок. Открывается и просматривается.
Не могу именно открыть на второй форме.
Пробывал форму открывать как не модальную, а обыкновенную не помогло.

Есть ли какие-нибудь настройки перед открытием второй формы?
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38559247
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INFINITs, ты точно что-то не так делаешь. Смотри присоединенный пример. FolderBrowserDialog без всяких проблем работает в другой форме. Для удобства в заголовке обоих форм выводится ManagedThreadId текущего потока и общее кол-во потоков в приложении. Попробуй у себя запустить.

INFINITsБеглый просмотр инета говорит, что для открытия второй формы в диалоговом формате, выделяется еще один поток и из-за этого потом я не могу открыть на ней folderBrowserDialog.
Это не так.

INFINITsЕсть ли какие-нибудь настройки перед открытием второй формы?
Нет никаких особых настроек. Должно работать сразу. Может ты COM компоненты какие-то используешь или сторонние элементы управления? Похоже кто-то в твоем приложении создает новый поток и код запуска второй формы идет именно в нем, а не в UI-потоке.
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38559256
INFINITs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile INFINITs, ты точно что-то не так делаешь. Смотри присоединенный пример. FolderBrowserDialog без всяких проблем работает в другой форме. Для удобства в заголовке обоих форм выводится ManagedThreadId текущего потока и общее кол-во потоков в приложении. Попробуй у себя запустить.


Посмотрел, запустил, запустился.
Создал свой пустой проект, все отработало.

Чуть позже попробую, посмотреть кто у меня создает еще один поток.
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38559266
INFINITs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за внимание.
Вообщем, как всегда я натупил, пора отдохнуть)

Косяк был в Program.cs
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[STAThread]
static void InitParametrPO()
{//бла бла
}

 static void Main()
 {Application.EnableVisualStyles();              
   Application.SetCompatibleTextRenderingDefault(false);              
   InitParametrPO();              
   Application.Run(new Form_Main());
}



После того как перенес его над Main() все заработало )
Хотя почему я думал [STAThread] должен был отработать, надо будет перечитать мануал.

И наверное надо будет казнить InitParametrPO(), перенести в загрузку формы.
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38559327
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INFINITs, [STAThread] должен применться к точке входа программы, то есть к функции Main.
...
Рейтинг: 0 / 0
folderBrowserDialog во второй форме
    #38559388
INFINITs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile, уже прочитал. Огромное спасибо за помощь)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / folderBrowserDialog во второй форме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]