Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从my usercontrol打开模式窗体_C#_Winforms_Multithreading - Fatal编程技术网

C# 从my usercontrol打开模式窗体

C# 从my usercontrol打开模式窗体,c#,winforms,multithreading,C#,Winforms,Multithreading,我有一个打开表单的usercontrol。我希望此表单以模态形式打开,其父级与usercontrol的父级相同。可能吗?(我只需要表单是开放模式的) 当我尝试(form.parent=this.parent)时,我得到一个错误,说该表单是顶级表单。 然后我尝试了(form.toplevel=false;form.parent=this.parent),这里我得到了一个跨线程操作错误 谢谢你的帮助 汉斯,这是我的部分代码,谢谢 private void Container_DragDrop(ob

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

<> P>有一个用户控件打开一个窗体有点嗡嗡声,考虑引发一个事件,以便控件的父窗体保持在控件中并显示对话框。

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

    private Form GetParentForm() {
        var parent = this.Parent;
        while (!(parent is Form)) parent = parent.Parent;
        return parent as Form;
    }
但你还有另一个问题,也是你一开始问这个问题的原因。您的对话框现在没有所有者,它可能会消失在另一个窗口后面。这是因为您的代码在另一个线程上运行。没有创建窗口的线程,因此无法提供所有者窗口,以及跨线程异常消息的原因


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

谢谢Hans,你说得对,试图打开表单的代码正在另一个线程中运行,你能给我一个具体的例子,说明我如何在UI线程上运行showdialog?如果没有任何片段来说明对话框的使用方法,我就不能给出一个非常不具体的问题的具体例子。我猜测线程是问题所在,这是一个幸运的猜测。您看过MSDN文章中的Control.Invoke()了吗?Hans,我试图调用该控件(这意味着使用methodinvoker委托从调用showdialog),但问题是我收到一条错误消息(您不能在创建窗体的窗口句柄之前调用它,据我所知,窗口句柄是在显示窗口之后创建的)我刷新了一下页面。编辑你的问题。您的代码段没有显示任何控件的证据。调用时,我无法猜出当我看不到不起作用的代码时它为什么不起作用。我想我会认输的,你知道问题的根源,祝你好运。