mdi子窗口关闭的时候,主窗口产生什么事件?

时间:2021-08-31 23:50:29
主窗口可能有若干个不同的mdi窗口,我希望某个mdi窗口关闭的时候,主窗口执行一些相关代码,但是这个事件怎么也找不到。
应该没那么难啊。

17 个解决方案

#1


在每一个子窗体中都定义一个委托
在父窗体中定义处理方法!
比如:
子窗体 form2 中
public System.EventHandler childclose = new System.EventHandler();
在form2_close事件中写:
 childclose(this,EventArgs.Empty);
父窗体中写:
private void dealChildClose(object sender,EventArgs e)
{
  //处理关闭后的事务。
}
父窗体调用子窗体时:
form2 f=new form2();
f.childclose+=new EventHandler(dealChildClose);
f.MDIParent=this;
f.Show();

end sub

#2


楼上是用事件处理的方式吧,这样要改所有的mdi子窗口,窗口太多了,以后还可能增加,不想让窗口顾及这么多,没有其他的方式吗。

mdi窗口变化的时候主窗口有一个mdi菜单列表会随着变化,能不能监视这个列表啊。

#3


在每一个Mdi窗体关闭的时候设置DialogResult值,主窗体都可以得到DialogResult值。如果简单的完成一些操作就可以用这个方法。
如果复杂一点的画,建议你用一些Class,保存mdi中的设置或者操作,当然这些class在父窗体中new,在mdi中使用,

#4


类似于zouhuiyong的方法,稍微改进一下:

先从Window.Form 派生一个类,比如叫MDIForm。
在MDIForm触发close事件时调用父窗体的一个公有方法。

然后,你所有的MDI子窗体都使用MDIForm就成了

#5


加分再顶,请高手出招。

#6


noky(孤狼傲血)的方法比较可取.....但是操作很复杂的话还是不建议用MDI

#7


加分再顶

#8


在mdi主窗体的MdiChildActivate事件中做处理,参看msdn对它的介绍。

#9


楼上:
确实触发MdiChildActivate事件,但是在这个事件中我不知道是关闭的哪个窗口,因为在这里检查所有窗口,都和没关闭以前的效果一样,窗口是在这个事件之后关闭的。我不能区分是关闭窗口触发的,还是用Ctrl+Tab切换mdi窗口触发的。

跟踪发现有三个属性有点区别,但是msdn上查不到他们的资料,他们也不能直接访问:
calledCreateControl true bool
calledMakeVisible true bool
calledOnLoad true bool

#10


关闭窗口和MidChildActive没有必然关系。

窗体关闭触发FormClosed事件。主窗体如果想让某个子窗体通知自己,就要对它的这个事件注册自己的方法。没有必要额外定义多余的委托。

#11


使用vs开发环境,通过鼠标点取可以“自动”生成事件的实现代码(的框架),只不过它是在WinForm所在的类型“内”产生的。

但是在一个类型外的另外的类型写事件注册代码又有什么不一样的呢?总不至于离开RAD工具就不会写程序了吧。

#12


不用抄书,关键还是自己了解事件的原理。

只要写到:

form2 f=new form2();
f.childclose+=

即使使用RAD,此时只能感知就知道你的意图了。

#13


sorry, 不是 childclose 应该是 FormClosed。

#14


to: sp1234(暂时没有) 

mdi窗口关闭后,确实触发MidChildActive事件,事件处理函数中用this.MdiChildren[i]可以找到所有mdi窗口,但是找到的包括关闭的窗口,也就不知道哪个窗口是关闭而产生触发的。

#15


还有,不想在每个mdi窗口的中增加代码,来通知parent。只想在包含mdi的主窗口判断。

#16


哥们,这么多人给你回答,这么多天啦,快结贴啊,我等分用呢!

#17


ok,结贴。不过结贴也不增加可用分,只增加专家分。

#1


在每一个子窗体中都定义一个委托
在父窗体中定义处理方法!
比如:
子窗体 form2 中
public System.EventHandler childclose = new System.EventHandler();
在form2_close事件中写:
 childclose(this,EventArgs.Empty);
父窗体中写:
private void dealChildClose(object sender,EventArgs e)
{
  //处理关闭后的事务。
}
父窗体调用子窗体时:
form2 f=new form2();
f.childclose+=new EventHandler(dealChildClose);
f.MDIParent=this;
f.Show();

end sub

#2


楼上是用事件处理的方式吧,这样要改所有的mdi子窗口,窗口太多了,以后还可能增加,不想让窗口顾及这么多,没有其他的方式吗。

mdi窗口变化的时候主窗口有一个mdi菜单列表会随着变化,能不能监视这个列表啊。

#3


在每一个Mdi窗体关闭的时候设置DialogResult值,主窗体都可以得到DialogResult值。如果简单的完成一些操作就可以用这个方法。
如果复杂一点的画,建议你用一些Class,保存mdi中的设置或者操作,当然这些class在父窗体中new,在mdi中使用,

#4


类似于zouhuiyong的方法,稍微改进一下:

先从Window.Form 派生一个类,比如叫MDIForm。
在MDIForm触发close事件时调用父窗体的一个公有方法。

然后,你所有的MDI子窗体都使用MDIForm就成了

#5


加分再顶,请高手出招。

#6


noky(孤狼傲血)的方法比较可取.....但是操作很复杂的话还是不建议用MDI

#7


加分再顶

#8


在mdi主窗体的MdiChildActivate事件中做处理,参看msdn对它的介绍。

#9


楼上:
确实触发MdiChildActivate事件,但是在这个事件中我不知道是关闭的哪个窗口,因为在这里检查所有窗口,都和没关闭以前的效果一样,窗口是在这个事件之后关闭的。我不能区分是关闭窗口触发的,还是用Ctrl+Tab切换mdi窗口触发的。

跟踪发现有三个属性有点区别,但是msdn上查不到他们的资料,他们也不能直接访问:
calledCreateControl true bool
calledMakeVisible true bool
calledOnLoad true bool

#10


关闭窗口和MidChildActive没有必然关系。

窗体关闭触发FormClosed事件。主窗体如果想让某个子窗体通知自己,就要对它的这个事件注册自己的方法。没有必要额外定义多余的委托。

#11


使用vs开发环境,通过鼠标点取可以“自动”生成事件的实现代码(的框架),只不过它是在WinForm所在的类型“内”产生的。

但是在一个类型外的另外的类型写事件注册代码又有什么不一样的呢?总不至于离开RAD工具就不会写程序了吧。

#12


不用抄书,关键还是自己了解事件的原理。

只要写到:

form2 f=new form2();
f.childclose+=

即使使用RAD,此时只能感知就知道你的意图了。

#13


sorry, 不是 childclose 应该是 FormClosed。

#14


to: sp1234(暂时没有) 

mdi窗口关闭后,确实触发MidChildActive事件,事件处理函数中用this.MdiChildren[i]可以找到所有mdi窗口,但是找到的包括关闭的窗口,也就不知道哪个窗口是关闭而产生触发的。

#15


还有,不想在每个mdi窗口的中增加代码,来通知parent。只想在包含mdi的主窗口判断。

#16


哥们,这么多人给你回答,这么多天啦,快结贴啊,我等分用呢!

#17


ok,结贴。不过结贴也不增加可用分,只增加专家分。