很急的一个问题,关于显示 MDI 子窗体

huangyj 2006-11-10 05:59:56
在 MDI 的主窗体中,调用以下代码显示子窗体

FrmSZBOB frmSZBOB = new FrmSZBOB();
frmSZBOB.MdiParent = this;
frmSZBOB.WindowState = FormWindowState.Maximized;
frmSZBOB.Show();

报告如下错误:

Controls created on one thread cannot be parented to a control on a different thread.
parameter name:value

不知道该如何解决。
请帮忙
...全文
265 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovvver 2006-11-13
  • 打赏
  • 举报
回复
楼主是在主窗体中,新开一个线程来打开这个mdi子窗体的吗?
Qim 2006-11-13
  • 打赏
  • 举报
回复
报告如下错误:

Controls created on one thread cannot be parented to a control on a different thread.
parameter name:value

在执行这段代码的时候,首先需要设置主窗体的IsMdiContainer属性为true。
jcyluck 2006-11-13
  • 打赏
  • 举报
回复
如果我没猜错的话,FrmSZBOB是从另一个窗体(比如form1)的实例对对像,现在又要为FrmSZBOB创建一个实例对像frmSZBOB,系统不允许这样做,如果你还要创建一个form1的实例,那么应该直接创建from1的一个对像,而不是FrmSZBOB的对像。将上面代码中的FrmSZBOB改成FrmSZBOB的父级窗体的名称,如果FrmSZBOB是form1的对像则是:

form1 frmSZBOB = new form1();
form1.MdiParent = this;
form1.WindowState = FormWindowState.Maximized;
fform1.Show();
xiyangsl 2006-11-13
  • 打赏
  • 举报
回复
FrmSZBOB frmSZBOB = new FrmSZBOB();
frmSZBOB.MdiParent = this;
frmSZBOB.WindowState = FormWindowState.Maximized;
frmSZBOB.Show();

代码没有问题 可能是你其他部分代码的问题
huangyj 2006-11-13
  • 打赏
  • 举报
回复
主窗体的设定没有问题的
huangyj 2006-11-13
  • 打赏
  • 举报
回复
JSIFENG()

你的方法可以不出现错误,但是显示子窗体不正确。
huangyj 2006-11-13
  • 打赏
  • 举报
回复
十分感谢 woyaomoney 和 Brunhild()

以及其它关注的朋友

解决了

确实应该用不同的线程来调用
JSIFENG 2006-11-13
  • 打赏
  • 举报
回复
把frmSZBOB.MdiParent = this;这句改为:frmSZBOB.MdiParent = this.ParentForm;

看看!应该没有问题!
huangyj 2006-11-13
  • 打赏
  • 举报
回复
楼上的朋友能给一段例子吗?

用 C# 不久
Brunhild 2006-11-13
  • 打赏
  • 举报
回复
你是在另一个线程里面打开子窗体出问题,可以试试用invoke调用打开窗体的代码,例如:
private void button1_Click(object sender, System.EventArgs e)
{
System.Threading.Thread thd=new System.Threading.Thread(new System.Threading.ThreadStart(this.ThreadProc));
thd.Start();
}

private void ThreadProc()
{
this.Invoke(new System.Threading.ThreadStart(this.ShowForm));
}

private void ShowForm()
{
Form f=new Form();
f.MdiParent=this;
f.Show();
}
woyaomoney 2006-11-13
  • 打赏
  • 举报
回复
UI 线程和COM 组件不是一个线程,你在COM线程里不能操纵UI的,我觉得你需要写一个回调函数,显示子窗口代码应该在UI线程立执行
just try

*****************************************************************************
欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码)
http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
huangyj 2006-11-13
  • 打赏
  • 举报
回复
jcyluck(C# + SQL 2005 QQ群:26096739)

FrmSZBOB 是一个子窗体对象

huangyj 2006-11-13
  • 打赏
  • 举报
回复
不是的

我的是一个主窗体中嵌入了一个 COM 组件
这个组件中间有一些的事件通知

在事件响应的代码中,创建MDI子窗口,进行显示操作。
这个时候就会出问题。

而在工具栏的按钮的点击事件中,同样的代码显示子窗口,确不会出现问题。
jcyluck 2006-11-13
  • 打赏
  • 举报
回复
不好意思,我上面的答案是错误的
正确的答案应该是将FrmSZBOB窗体的IsMdiContainer属性设为true。
xjjdanran 2006-11-10
  • 打赏
  • 举报
回复
没碰过,UP
Knight94 2006-11-10
  • 打赏
  • 举报
回复
在执行这段代码的时候,首先需要设置主窗体的IsMdiContainer属性为true。
zzd8310 2006-11-10
  • 打赏
  • 举报
回复
帮你顶

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧