C# 从my usercontrol打开模式窗体
我有一个打开表单的usercontrol。我希望此表单以模态形式打开,其父级与usercontrol的父级相同。可能吗?(我只需要表单是开放模式的) 当我尝试(form.parent=this.parent)时,我得到一个错误,说该表单是顶级表单。 然后我尝试了(form.toplevel=false;form.parent=this.parent),这里我得到了一个跨线程操作错误 谢谢你的帮助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
汉斯,这是我的部分代码,谢谢
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),但问题是我收到一条错误消息(您不能在创建窗体的窗口句柄之前调用它,据我所知,窗口句柄是在显示窗口之后创建的)我刷新了一下页面。编辑你的问题。您的代码段没有显示任何控件的证据。调用时,我无法猜出当我看不到不起作用的代码时它为什么不起作用。我想我会认输的,你知道问题的根源,祝你好运。