открыть модальную форму из моего usercontrol - PullRequest
0 голосов
/ 13 октября 2010

У меня есть usercontrol, который открывает форму.я хочу, чтобы эта форма открывалась как модальная, имея своего родителя того же родителя usercontrol.это возможно?(все, что мне нужно, это то, что форма является открытой модальной).

, когда я пытался (form.parent = this.parent), я получил сообщение о том, что форма является формой верхнего уровня.Затем я попытался (form.toplevel = false; form.parent = this.parent), и здесь я получил ошибку операции между потоками.

спасибо за помощь.


Ганс, вот части моего кода, спасибо.

private void Container_DragDrop(object sender, DragEventArgs args)   
{

         ThreadPool.QueueUserWorkItem(
                delegate(object state)
                {

                    object[] parameters = (object[])state;
                    object s = parameters[0];
                    DragEventArgs e = parameters[1] as DragEventArgs;
                    this.OnContainerDragandDrop(s, e);

                },
                new object[] { sender, args });
}

private void OnContainerDragandDrop(object sender, DragEventArgs e)
    {
    //here I am calling a method
    MyMethod(e)
    }

private void MyMethod(DragEventArgs e)
{
mywcfClient.MyrequestWasSuccessfull += new MyRequestInfoEventHandler(mywcfClient_MyrequestWasSuccessfull);
}

void  mywcfClient_MyrequestWasSuccessfull (object sender, MyRequestInfoEventargs args)
{

//this is where I wanna show my form
From frm = new Form();
Frm.showdialog() //here the form is showing but non modal, i want to show it as modal}

1 Ответ

1 голос
/ 13 октября 2010

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

Но хорошо, если диалоговое окно является полной деталью реализации элемента управления. Не устанавливайте Parent, вам нужно использовать перегрузку ShowDialog (владельца), если вы хотите выбрать конкретного владельца. Обычно в этом нет необходимости, метод ShowDialog () ищет подходящего владельца, если вы его не указали. Вы можете найти родительскую форму элемента управления с кодом, подобным следующему:

    private Form GetParentForm() {
        var parent = this.Parent;
        while (!(parent is Form)) parent = parent.Parent;
        return parent as Form;
    }

Но у вас есть другая проблема, а также причина, по которой вы задали этот вопрос. У вашего диалога сейчас нет владельца, и он может исчезнуть за другим окном. Это потому, что ваш код работает в другом потоке. Поток, который не создал окон и, следовательно, не может предоставить окно владельца, а также причину сообщения об исключении между потоками.

Вам необходимо использовать Control.Invoke для запуска кода диалога в потоке пользовательского интерфейса. Для этого есть хороший пример в теме библиотеки MSDN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...