个人版机房中开始没有考虑子父窗体的设置问题,这样出现什么问题,如果将主窗体关闭,而你的打开窗体仍不会关掉,这是肯定不允许的,网上查了一下,还挺容易。
Private Sub MenuInquirePresentCash_Click(sender As Object, e As EventArgs) Handles MenuInquirePresentCash.Click Dim fIPC As New frmInquirePresentCash '实例化frmInquirePresentCash窗体 fIPC.MdiParent = Me '将实例化窗体的父窗体设置为当前Main窗体 fIPC.Show() End Sub
但是这样的结果是子窗体被父窗体控件覆盖,怎么办?
记得第一次机房中用到frame容器性质的控件,在.net中找到Panel控件,将主窗体中的控件都放在Panel中,我的做法是每次子窗体打开时将Panel隐藏,退出时再显示。
Private Sub MenuInquirePresentCash_Click(sender As Object, e As EventArgs) Handles MenuInquirePresentCash.Click Dim fIPC As New frmInquirePresentCash '实例化frmInquirePresentCash窗体 fIPC.MdiParent = Me '将实例化窗体的父窗体设置为当前Main窗体 fIPC.Show() Panel1.Visible = False '子窗体打开时 Panel1不可见 End Sub
这样问题又来了,如果打开一个子窗体,然后再打开一个,这时选择关闭其中一个的话,这是Panel控件将为可见,也就是说另外一个窗体还是被隐藏。
一直都是这么做的,但总觉得这么做太没有思想了,偶然看到一清博客也有关于这个问题方案,在U层新建了一个SetMDIChild类,有两种解决方法,一是将子窗体显示在MDI主窗体Panel控件之上,二是将子窗体上的控件内嵌到MDI主窗体panel控件之上,然后再主窗体直接调用这个类的方法。
'/********************* '类名称:SetMDIChild '功能: '命名空间:Charge.UI '作者:李立平 '小组: '时间:2014/10/1 11:48:49 '版本号:v2.0.0 '**********************/ Public Class SetMDIChild '子窗体显示在MDI主窗体Panel控件之上 Public Sub SetMDIChildFront(frm As Form, Panel1 As Panel) frm.TopLevel = False '设置它的顶级为false frm.FormBorderStyle = Windows.Forms.FormBorderStyle.Sizable '设置子窗体的边框风格 frm.Parent = Panel1 '设置子窗体的父容器控件是panel控件 frm.Show() '子窗体显示 frm.BringToFront() '设置子窗体在最前面 End Sub '子窗体上的控件内嵌到mdi主窗体panel控件之上 Public Sub setMDIchild(frm As Form, Panel1 As Panel) frm.FormBorderStyle = FormBorderStyle.None '改变frmmain的边框风格,为无边框风格 frm.TopLevel = False '不将子窗体设置为顶级窗体 Panel1.Controls.Add(frm) '设置panel控件中控件集合应该包括frm子窗体 frm.Show() End Sub End Class
很好解决了子窗体的最小化和显示问题,美中不足的是一清的方案没有用到单例模式,他在U层类的时候没有将子窗体实例化,所以也是显示一个窗体,所以单例模式还是要用的。因为单例模式在每个子窗体中声明变量和方法,我也没有把得到每个子窗体的实例方法抽象出来,现在想着如何在U层类中调用实例化子窗体的方法,研究中。。。
遇到问题首先自己思考找方法,然后可以通过和别人交流拓宽自己的思路,身边的小伙伴都是我们的巨人!