从我的usercontrol打开一个模态表单

时间:2010-10-13 10:20:58

标签: c# winforms multithreading

我有一个打开表单的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 个答案:

答案 0 :(得分:1)

让用户控件打开表单有点蠢,考虑引发一个事件,以便控件的父表单保持控制并显示对话框。

但是,如果对话框是控件的完整实现细节,那就没关系。不设置Parent,如果要选择特定的所有者,则需要使用ShowDialog(所有者)重载。通常不需要,如果您没有指定一个,ShowDialog()方法会寻找合适的所有者。您可以使用以下代码找到控件的父窗体:

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

但是你还有另一个问题,也就是你首先提出这个问题的原因。您的对话框现在没有所有者,很可能会在另一个窗口后面消失。那是因为你的代码在另一个线程上运行。一个没有创建窗口的线程,因此无法提供所有者窗口,以及跨线程异常消息的原因。

您需要使用Control.Invoke在UI线程上运行对话框代码。在MSDN Library主题中有一个很好的例子。