赞
踩
在开发Winform时,Mdi有很多子窗口,当然有不同的子窗口类名,比如FrmWin1,FrmWin2, FrmWin3 , 因为打开这些窗口时需要有一些判断,具体如下:
1)判断FrmWin1是否打开了,如果没有打开,就打开FrmWin1,否则激活FrmWin1,防止重复打开FrmWin1。
2)因为FrmWin类比较多,每次都是new,这样觉得不方便,并且代码量较多,原来就尝试用“FrmWin类名+反射”来打开窗口,完成项目后,就忘记了。
这次准备做个小程序,就有捡起来,记录下以便后面不再遗忘。
OK,下面直接源码了。
ControlHelper.cs类
/// <summary> /// 判断子窗体是否打开 /// </summary> /// <param name="formName"></param> /// <returns></returns> public static bool MdiChildWinIsOpened(this Form parentFrm, string frmName) { bool isOpen = false; //判断父窗口IsMdiContainer是否true,否则设置true if (!parentFrm.IsMdiContainer) parentFrm.IsMdiContainer = true; foreach (Form childrenForm in parentFrm.MdiChildren) { // 检测是不是当前子窗口名称 if (childrenForm.Name == frmName) { // 是,显示 childrenForm.Visible = true; // 激活 childrenForm.Activate(); //childrenForm.WindowState = FormWindowState.Maximized; isOpen = true; } } return isOpen; } /// <summary> /// 根据窗口名称打开Mdi子窗口 /// </summary> /// <param name="parentFrm">父窗口,默认this</param> /// <param name="frmClassFullName">Form类的全名称:命名空间名.类名 </param> /// <param name="assembly">程序集</param> public static void MdiChildWinOpen(this Form parentFrm, string frmName, Assembly assembly) { // 判断子窗体是否打开, 如果没有打开 if (MdiChildWinIsOpened(parentFrm, frmName) == false ) { //Assembly assembly = Assembly.GetExecutingAssembly(); // 拼接成class的全名称:命名空间名.类名 // 通过,分割,取第一个字符串strList[0]为"命名空间名" string[] strList = assembly.FullName.Split(','); string frmFullName = string.Format("{0}.{1}", strList[0], frmName); // 根据class的全名称,实例化窗体 Form frm = assembly.CreateInstance(frmFullName) as Form; // 设置Mdi的Father窗口 frm.MdiParent = parentFrm; frm.WindowState = FormWindowState.Maximized; frm.Show(); } }
使用方式, 在主窗口FrmMain的菜单Clicked事件中调用方法
ControlHelper.MdiChildWinOpen() 即可,具体如下:
// 打开FrmWin1窗口
ControlHelper.MdiChildWinOpen(this, "FrmWin1", Assembly.GetExecutingAssembly());
// 打开FrmWin2窗口
ControlHelper.MdiChildWinOpen(this, "FrmWin2", Assembly.GetExecutingAssembly());
这样用起来,是不是很简单!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。