缘起
在开发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());
这样用起来,是不是很简单!!