Немного гудит, когда пользовательский элемент управления открывает форму, подумайте о том, чтобы вызвать событие, чтобы родительская форма элемента управления оставалась под контролем и отображала диалоговое окно.
Но хорошо, если диалоговое окно является полной деталью реализации элемента управления. Не устанавливайте Parent, вам нужно использовать перегрузку ShowDialog (владельца), если вы хотите выбрать конкретного владельца. Обычно в этом нет необходимости, метод ShowDialog () ищет подходящего владельца, если вы его не указали. Вы можете найти родительскую форму элемента управления с кодом, подобным следующему:
private Form GetParentForm() {
var parent = this.Parent;
while (!(parent is Form)) parent = parent.Parent;
return parent as Form;
}
Но у вас есть другая проблема, а также причина, по которой вы задали этот вопрос. У вашего диалога сейчас нет владельца, и он может исчезнуть за другим окном. Это потому, что ваш код работает в другом потоке. Поток, который не создал окон и, следовательно, не может предоставить окно владельца, а также причину сообщения об исключении между потоками.
Вам необходимо использовать Control.Invoke для запуска кода диалога в потоке пользовательского интерфейса. Для этого есть хороший пример в теме библиотеки MSDN.