winform 创建窗口句柄时出错

it2023-06-02  70

最近在做一个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));

最新回复(0)