#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);
}
}
}