最近在做一个winform 的项目,由于是需要多页面切换跳转的,所以用了MDI窗体,经常需要子窗体之间跳转,窗体的跳转的代码如下:
FormFaceLogin frm = new FormFaceLogin(); frm.TopLevel = false; frm.Dock = DockStyle.Fill; frm.FormBorderStyle = FormBorderStyle.None; //设置新窗体的Parent frm.Parent = this; //释放资源 foreach (Control item in this.Controls) { item.Dispose(); } this.Controls.Clear(); this.Controls.Add(frm); frm.Show();
窗体切换的次数多了,就会报错:创建窗口句柄时出错,尝试了各种办法都没有解决,最后通过断点调试,发现窗体跳转的时候,并没有执行FormClosed方法和FormCloseing方法,然后每一次跳转窗体的时候,就会重新new一次窗体对象,对象一直在增加,但是并没有销毁,知道了问题所在,就好解决了,解放方案如下:
1.新建一个子窗体FrmChild ,在FrmChild 写一个公共的方法:
public void FindChildForm(Type type) { Form frm = null;
//在当前程序中查找要打开的窗体是否已经new过,如果已经创建了对象,直接激活,否则创建。 foreach (Form frmChild in Application.OpenForms) { if (frmChild.GetType() == type) { frm = frmChild; frm.BringToFront(); frm.Activate(); } } if (frm == null) { frm = (Form)Activator.CreateInstance(type); frm.TopLevel = false; frm.Dock = DockStyle.Fill; frm.FormBorderStyle = FormBorderStyle.None; frm.Parent = FormMdi.GetPanel;//此处在FormMdi窗体设置子窗体时,记录了控件的父容器,所有子窗体的父容器都为FormMdi.GetPanel frm.BringToFront(); frm.Show(); } }
2.所有的子窗体都继承FrmChild ,在窗体跳转时,直接调用FindChildForm方法:
FindChildForm(typeof(FormCardIndex));