#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
|
{
|
/// <summary>
|
/// 主窗体工具类, 打开子窗体
|
/// </summary>
|
public class MdiTools
|
{
|
private static Form _MdiMainForm;
|
|
/// <summary>
|
/// 应用程序的主窗体(实现IMdiForm)
|
/// </summary>
|
public static Form MainForm
|
{
|
get => _MdiMainForm;
|
set => _MdiMainForm = value;
|
}
|
|
/// <summary>
|
/// 如果窗体已经打开激活即可.
|
/// </summary>
|
/// <param name="mdiParent">主窗体对象引用</param>
|
/// <param name="formTypeName">子窗体的命名空间全名</param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 查找窗体
|
/// </summary>
|
/// <param name="formTypeFullName">窗体类的全名</param>
|
/// <returns></returns>
|
public static Form FindForm(string formTypeFullName)
|
{
|
foreach (Form form in Application.OpenForms)
|
if (form.GetType().FullName.ToUpper() ==
|
formTypeFullName.ToUpper())
|
return form;
|
|
return null;
|
}
|
|
/// <summary>
|
/// 打开子窗体
|
/// </summary>
|
/// <param name="mdi">MDI主窗体</param>
|
/// <param name="formType">子窗体的类型</param>
|
/// <param name="menu">打开窗体的菜单项</param>
|
/// <returns></returns>
|
public static Form OpenChildForm(IMdiForm mdi, Type formType,
|
ToolStripMenuItem menu)
|
{
|
return OpenChildForm(mdi, formType, menu, null);
|
}
|
|
/// <summary>
|
/// 打开子窗体,支持向构造器传递参数
|
/// </summary>
|
/// <param name="mdi">MDI主窗体</param>
|
/// <param name="formType">窗体类型</param>
|
/// <param name="menu">打开窗体的菜单项</param>
|
/// <param name="args">窗体构造器的参数</param>
|
/// <returns></returns>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 打开MDI子窗体
|
/// </summary>
|
/// <param name="mdi">MDI主窗体</param>
|
/// <param name="formType">子窗体的类型</param>
|
/// <param name="menuName">菜单名称</param>
|
/// <param name="singleInstance">true:单个窗体实例, false:允许打开多个相同的窗体</param>
|
/// <returns></returns>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 打开子窗体.
|
/// </summary>
|
/// <param name="mdi">MDI主窗体</param>
|
/// <param name="formType">子窗体的类型</param>
|
/// <param name="menu">打开窗体的菜单项</param>
|
/// <param name="param">打开窗体的需要传递的参数</param>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 打开MDI子窗体
|
/// </summary>
|
/// <param name="mdi">MDI主窗体</param>
|
/// <param name="formType">子窗体的类型</param>
|
/// <param name="singleInstance">true:单个窗体实例, false:允许打开多个相同的窗体</param>
|
/// <returns></returns>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 打开MDI子窗体
|
/// </summary>
|
/// <param name="mdi">MDI主窗体</param>
|
/// <param name="formType">子窗体的类型</param>
|
/// <returns></returns>
|
public static Form OpenChildForm(IMdiForm mdi, Type formType)
|
{
|
return OpenChildForm(mdi, formType, true);
|
}
|
}
|
}
|