#region using System; using System.Reflection; using System.Windows.Forms; using CSFrameworkV5.Business.BLL_Permission; using CSFrameworkV5.Common; using CSFrameworkV5.Core; #endregion ///*************************************************************************/ ///* ///* 文件名 :MdiTools.cs ///* 程序说明 : 主窗体工具类, 打开子窗体 ///* 原创作者 :www.csframework.com ///* ///* Copyright 2006-2021 C/S框架网 www.csframework.com ///* ///**************************************************************************/ namespace CSFrameworkV5.Library.CommonClass { /// /// 主窗体工具类, 打开子窗体 /// public class MdiTools { private static Form _MdiMainForm; /// /// 应用程序的主窗体(实现IMdiForm) /// public static Form MainForm { get => _MdiMainForm; set => _MdiMainForm = value; } /// /// 如果窗体已经打开激活即可. /// /// 主窗体对象引用 /// 子窗体的命名空间全名 /// public static Form ActiveChildForm(Form mdiParent, string formTypeName) { for (var x = 0; x < mdiParent.MdiChildren.Length; x++) { var ss = mdiParent.MdiChildren[x].GetType().ToStringEx() .ToUpper(); //名字空间 if (ss == formTypeName.ToUpper()) //找到字窗体 { var child = mdiParent.MdiChildren[x] as IMdiChildForm; if (child.AllowMultiInstatnce) continue; //允许多个实例的窗体,跳过窗体副本 if (mdiParent.ActiveMdiChild.GetType().ToStringEx() .ToUpper() == formTypeName.ToUpper()) return mdiParent.ActiveMdiChild; //当前窗体,跳过 mdiParent.MdiChildren[x].Activate(); return mdiParent.MdiChildren[x]; } } return null; } /// /// 查找窗体 /// /// 窗体类的全名 /// public static Form FindForm(string formTypeFullName) { foreach (Form form in Application.OpenForms) if (form.GetType().FullName.ToUpper() == formTypeFullName.ToUpper()) return form; return null; } /// /// 打开子窗体 /// /// MDI主窗体 /// 子窗体的类型 /// 打开窗体的菜单项 /// public static Form OpenChildForm(IMdiForm mdi, Type formType, ToolStripMenuItem menu) { return OpenChildForm(mdi, formType, menu, null); } /// /// 打开子窗体,支持向构造器传递参数 /// /// MDI主窗体 /// 窗体类型 /// 打开窗体的菜单项 /// 窗体构造器的参数 /// public static Form OpenChildForm(IMdiForm mdi, Type formType, ToolStripMenuItem menu, object[] args) { try { frmWaitingEx.ShowMe(mdi as Form); //试图激活已打开的子窗体 var form = ActiveChildForm(mdi as Form, formType.ToStringEx()); if (form != null) return form; //通过反射创建窗体实例,传入参数 form = (Form)formType.Assembly.CreateInstance(formType.FullName, true, BindingFlags.CreateInstance, null, args, null, null); //创建窗体实例失败 if (form == null) throw new Exception("未知窗体类型!"); //是系统定义的子窗体 if (form is IMdiChildForm) { form.MdiParent = (Form)mdi; //设置主窗体 (form as IMdiChildForm).ToolbarRegister = mdi.MdiToolbar; //绑定主窗体的Toolbar对象 (form as IMdiChildForm) .RegisterObserver(mdi .MdiObservers); //注册子窗体的观察者 } //支持权限控制的子窗体 if (form is IPurviewControllable) if (menu != null && menu.Tag is MenuItemTag) { var auth = new bllPermission().GetUserActions( Loginer.CurrentUser.Account, menu.Name); //获取窗体的权限 (form as IPurviewControllable).FormAuthorities = auth; //当前用户拥有本窗体的权限值 (form as IPurviewControllable).FormMenuName = menu.Name; //绑定打开窗体的菜单名 } LogUserOperate.WriteOpenFormLog(form, "打开窗体", menu != null ? menu.Name : ""); form.Show(); //显示窗体 return form; } catch (Exception e) { var msg = "打开窗体时出现错误!" + e.Message; Msg.Warning(msg); LogUserOperate.Write(msg); return null; } finally { frmWaitingEx.HideMe(mdi as Form); } } /// /// 打开MDI子窗体 /// /// MDI主窗体 /// 子窗体的类型 /// 菜单名称 /// true:单个窗体实例, false:允许打开多个相同的窗体 /// public static Form OpenChildForm(IMdiForm mdi, Type formType, string menuName, bool singleInstance) { try { frmWaitingEx.ShowMe(mdi as Form); var child = ActiveChildForm(mdi as Form, formType.ToStringEx()); if (singleInstance && child != null) { child.Show(); return child; } var form = (Form)formType.Assembly.CreateInstance(formType.FullName); if (form != null && form is Form) { child = form; if (form is IMdiChildForm) { (child as IMdiChildForm).ToolbarRegister = mdi.MdiToolbar; (child as IMdiChildForm).RegisterObserver( mdi.MdiObservers); child.MdiParent = (Form)mdi; } //支持权限控制的子窗体 if (form is IPurviewControllable) { var auth = new bllPermission().GetUserActions( Loginer.CurrentUser.Account, menuName); //获取窗体的权限 (form as IPurviewControllable).FormAuthorities = auth; //当前用户拥有本窗体的权限值 (form as IPurviewControllable).FormMenuName = menuName; //绑定打开窗体的菜单名 } LogUserOperate.WriteOpenFormLog(form, "打开窗体", menuName); child.Show(); return child; } else { throw new Exception("未知窗体类型!"); } } finally { frmWaitingEx.HideMe(mdi as Form); } } /// /// 打开子窗体. /// /// MDI主窗体 /// 子窗体的类型 /// 打开窗体的菜单项 /// 打开窗体的需要传递的参数 public static Form OpenChildForm(IMdiForm mdi, Type formType, string menuName, object param = null) { try { frmWaitingEx.ShowMe(mdi as Form); //试图激活已打开的子窗体 var form = ActiveChildForm(mdi as Form, formType.ToStringEx()); //如子窗体已打开显示子窗体并退出 if (form != null && param == null) return form; //通过反射创建窗体实例. form = (Form)formType.Assembly .CreateInstance(formType.FullName); //创建窗体实例失败 if (form == null) throw new Exception("未知窗体类型!"); //是系统定义的子窗体 if (form is IMdiChildForm) { form.MdiParent = (Form)mdi; //设置主窗体 (form as IMdiChildForm).ToolbarRegister = mdi.MdiToolbar; //绑定主窗体的Toolbar对象 (form as IMdiChildForm) .RegisterObserver(mdi.MdiObservers); //注册子窗体的观察者 (form as IMdiChildForm).SetParameter(param); //设置参数 } //支持权限控制的子窗体 if (form is IPurviewControllable) { var auth = new bllPermission().GetUserActions( Loginer.CurrentUser.Account, menuName); //获取窗体的权限 (form as IPurviewControllable).FormAuthorities = auth; //当前用户拥有本窗体的权限值 (form as IPurviewControllable).FormMenuName = menuName; //绑定打开窗体的菜单名 } LogUserOperate.WriteOpenFormLog(form, "打开窗体", menuName); form.Show(); //显示窗体 return form; } catch (Exception e) { var msg = "打开窗体时出现错误!" + e.Message; Msg.Warning(msg); LogUserOperate.Write(msg); return null; } finally { frmWaitingEx.HideMe(mdi as Form); } } /// /// 打开MDI子窗体 /// /// MDI主窗体 /// 子窗体的类型 /// true:单个窗体实例, false:允许打开多个相同的窗体 /// public static Form OpenChildForm(IMdiForm mdi, Type formType, bool singleInstance) { try { frmWaitingEx.ShowMe(mdi as Form); var child = ActiveChildForm(mdi as Form, formType.ToStringEx()); if (singleInstance && child != null) { child.Show(); return child; } var form = (Form)formType.Assembly.CreateInstance(formType.FullName); if (form != null && form is Form) { child = form; if (form is IMdiChildForm) { (child as IMdiChildForm).ToolbarRegister = mdi.MdiToolbar; (child as IMdiChildForm).RegisterObserver( mdi.MdiObservers); child.MdiParent = (Form)mdi; } LogUserOperate.WriteOpenFormLog(form, "打开窗体", ""); child.Show(); return child; } else { throw new Exception("未知窗体类型!"); } } finally { frmWaitingEx.HideMe(mdi as Form); } } /// /// 打开MDI子窗体 /// /// MDI主窗体 /// 子窗体的类型 /// public static Form OpenChildForm(IMdiForm mdi, Type formType) { return OpenChildForm(mdi, formType, true); } } }