Winform技巧1:通过窗口类名称+反射打开窗口

缘起

在开发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());

这样用起来,是不是很简单!!

猜你喜欢

转载自blog.csdn.net/coolhe21cn/article/details/104021033
今日推荐