#region using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using CSFrameworkV5.Business; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Language; using CSFrameworkV5.Library.CommonClass; using CSFrameworkV5.Library.Entry; using DevExpress.XtraBars; using DevExpress.XtraEditors; #endregion namespace CSFrameworkV5.Library { /// /// 所有MDI子窗体基类. /// public partial class frmBaseChild : frmBase, IMdiChildForm, IPurviewControllable, ISystemButtons { /// /// 打开当前窗体传入的预设参数, 界面需要根据此参数做特殊处理 /// protected object _CurrentParameter; public frmBaseChild() { InitializeComponent(); } /// /// 系统是否只保留一个子窗体实例 /// public bool AllowMultiInstatnce { get => _AllowMultiInstatnce; set => _AllowMultiInstatnce = value; } /// /// 给窗体设置参数,SetParameter方法在在Form.Load事件之前运行的, 因此需要在Form.Load事件内处理传入的参数。 /// 参考:MdiTools.OpenChildForm(IMdiForm mdi, Type formType, ToolStripMenuItem sender, object param)方法 /// /// public virtual void SetParameter(object param) { _CurrentParameter = param; } /// /// 清空容器内输入框. /// public void ClearContainerEditorText(Control container) { for (var i = 0; i < container.Controls.Count; i++) if (container.Controls[i] is TextEdit) ((TextEdit)container.Controls[i]).EditValue = null; else if (container.Controls[i] is TextBoxBase) ((TextBoxBase)container.Controls[i]).Clear(); } //当子窗体获得焦点时在主界面注册本窗体的按钮。 //通过Form Activated事件可以看到主窗体的ToolBar状态变化。 private void frmBaseChild_Activated(object sender, EventArgs e) { ToolbarRegister.RegisteButton(Buttons.ToList()); NotifyObserver(); //通过其它观察者 //显示系统操作页面(数据操作按钮页面) //new 20200202 (MdiParent as frmMain1).ShowDataOperatePage(); } private void frmBaseChild_FormClosed(object sender, FormClosedEventArgs e) { NotifyObserver(); //当关闭窗体,要通知所有子窗体观察者 } private void frmBaseChild_FormClosing(object sender, FormClosingEventArgs e) { IsClosing = true; //正在关闭状态 } //通知观察者进行更新 private void NotifyObserver() { foreach (IObserver o in _observers) if (o != null) o.Notify(); } #region 成员变量定义 /// /// 父窗体的Toolbar组件 /// protected IToolbarRegister _ToolbarRegister; /// /// 初始化子窗体的按钮数组 /// protected IButtonList _buttons = new ButtonList(); /// /// 子窗体的观察者 /// protected IList _observers = new ArrayList(); /// /// 子窗体的系统按钮 /// protected IButtonInfo[] _SystemButtons = null; /// /// 窗体是否正在关闭状态 /// protected bool _IsClosing; /// /// 否只保留一个子窗体实例 /// protected bool _AllowMultiInstatnce; /// /// 窗体的可用权限 /// protected int _FormAuthorities; /// /// 打开窗体的菜单名 /// protected string _FormMenuName = ""; #endregion #region IPurviewControllable 接口实现 /// /// 窗体可用权限.为2^n方:1,2,4,8,16.....n^2 /// 打开窗体时从数据库获取权限值保存在该变量 /// public int FormAuthorities { get => _FormAuthorities; set => _FormAuthorities = value; } /// /// 打开窗体的菜单名 /// public string FormMenuName { get => _FormMenuName; set => _FormMenuName = value; } /// /// 派生类通过重写该虚方法自定义每个按钮可用状态 /// public virtual bool ButtonAuthorized(int authorityValue) { if (Loginer.CurrentUser.IsAdmin()) return true; return (authorityValue & FormAuthorities) == authorityValue; } /// /// 检查当前用户是否拥有本窗体的某个权限 /// /// 需要检查的权限值,ButtonAuthority类定义功能点 /// public bool HasPurview(int value) { return (value & _FormAuthorities) == value; } #endregion #region IMdiChildForm 接口实现 /// /// 主窗体的Toolbar按钮注册器 /// public IToolbarRegister ToolbarRegister { get => _ToolbarRegister; set => _ToolbarRegister = value; } public virtual void RegisterToolBar(IToolbarRegister toolBarRegister) { //this.Buttons是当前窗体的按钮数组。 toolBarRegister.RegisteButton(Buttons.ToList()); } /// /// 当前窗体是否正在关闭状态 /// public bool IsClosing { get => _IsClosing; set => _IsClosing = value; } /// /// 注册子窗体观察者 /// public void RegisterObserver(IObserver[] observers) { foreach (var o in observers) _observers.Add(o); } /// /// 子窗体的按钮数组 /// public IButtonList Buttons => _buttons; /// /// 模板方法.初始化本窗体的按钮. /// public virtual void InitButtons() { //关闭按钮 _buttons.AddButton(ToolbarRegister.CreateButton("btnClose", LanLib.Get("关闭"), ToolBarGroup.关闭窗体, Globals.LoadBitmap("32_Exit.png"), new Size(57, 28), true, true, DoClose)); UpdateButtonCaption(); } /// /// 系统按钮列表。注:子窗体享用系统按钮,如帮助/关闭窗体常用功能。 /// public virtual IButtonInfo[] GetSystemButtons() { return _SystemButtons; } #region 处理快捷方式按钮 /// /// 更新快捷方式按钮的标题 /// public virtual void UpdateButtonCaption() { if (string.IsNullOrEmpty(FormButtonName)) { var btn = (BarItem)(MdiParent as IMdiForm).GetToolBarButton( ButtonNameList.ribbon_btnShortCut); if (btn != null) btn.Caption = LanLib.Get("设为常用"); return; } var FormFullName = GetType().FullName; var MenuName = FormMenuName; BarItem button = null; if (IsExistsShortCutButton(FormFullName, MenuName)) { _ShortCutButtonCaption = LanLib.Get("取消常用"); button = (BarItem)(MdiParent as IMdiForm).GetToolBarButton( ButtonNameList.ribbon_btnShortCut); if (button != null) button.Caption = LanLib.Get("取消常用"); } else { _ShortCutButtonCaption = LanLib.Get("设为常用"); button = (BarItem)(MdiParent as IMdiForm).GetToolBarButton( ButtonNameList.ribbon_btnShortCut); if (button != null) button.Caption = LanLib.Get("设为常用"); } if (string.IsNullOrEmpty(MenuName) || string.IsNullOrEmpty(FormFullName)) { button = (BarItem)(MdiParent as IMdiForm).GetToolBarButton( ButtonNameList.ribbon_btnShortCut); if (button != null) button.Enabled = false; } } private static bool IsExistsShortCutButton(string FormFullName, string MenuName) { var exists = new bllUserCustomAction().Exist(FormFullName, MenuName); return exists; } private bool _ButtonNameReady = false; private string _FormButtonName; /// /// 获取当前窗体对应的按钮 /// public string FormButtonName { get { if (!_ButtonNameReady && string.IsNullOrEmpty(_FormButtonName)) { var FormFullName = GetType().FullName; var MenuName = FormMenuName; _FormButtonName = (MdiTools.MainForm as IMdiForm) .GetModuleMainFormButtonNameByMenuName(FormFullName, MenuName); } return _FormButtonName; } } protected string _ShortCutButtonCaption = ""; /// /// 设为/取消 常用功能 /// /// public virtual void DoCreateShortCut() { var txt = _ShortCutButtonCaption; var FormFullName = GetType().FullName; var MenuName = FormMenuName; var Success = false; if (txt == LanLib.Get("设为常用")) { if (!Msg.AskQuestion("是否要建立 <" + Text + "> 窗体的快捷方式?")) return; //数据库添加 Success = new bllUserCustomAction().InsertData(FormFullName, MenuName, FormButtonName); } if (txt == LanLib.Get("取消常用")) { if (!Msg.AskQuestion("是否要取消 <" + Text + "> 窗体的快捷方式?")) return; //数据库删除 Success = new bllUserCustomAction().Delete(FormFullName, MenuName); } if (Success) { (MdiTools.MainForm as IMdiForm).UpdateModuleButtonLocal( Globals.DEF_CUSTOM_MODULE_MAIN); UpdateButtonCaption(); if (Success) Msg.ShowInformation(LanLib.Get("設置快捷按钮操作成功!")); } } #endregion public virtual void DoHelp(IButtonInfo button) //打开帮助 { DoHelp(); } public virtual void DoHelp() { HelpDoc.HelpAllFile(HelpDoc.CSHelp); //Msg.ShowInformation("已打开帮助文档,如派生的窗体需要打开指定帮助文件,请重写DoHelp方法。"); } public virtual void DoClose(IButtonInfo sender) { Close(); } public virtual void DoSetLanguageCHS(IButtonInfo sender) { if (LanLib.Current != LanguageType.CHS) { LanLib.Current = LanguageType.CHS; SetLanguageAllForm(); } } public virtual void DoSetLanguageCHT(IButtonInfo sender) { if (LanLib.Current != LanguageType.CHT) { LanLib.Current = LanguageType.CHT; SetLanguageAllForm(); } } public virtual void DoSetLanguageENG(IButtonInfo sender) { if (LanLib.Current != LanguageType.ENG) { LanLib.Current = LanguageType.ENG; SetLanguageAllForm(); } } private void SetLanguageAllForm() { //设置主窗体的语言 (MdiTools.MainForm as ILanguageSupport).SetLanguage(); foreach (Form form in Application.OpenForms) if (form is ILanguageSupport && form != MdiTools.MainForm) (form as ILanguageSupport).SetLanguage(); } public override void SetLanguage() { base.SetLanguage(); SetDynimcButtonLanguage(); Buttons.GetButtonByName("btnHelp").Caption = LanLib.Get("帮助"); Buttons.GetButtonByName("btnClose").Caption = LanLib.Get("关闭"); Buttons.GetButtonByName("btnLanguage").Caption = LanLib.Get("选择语言"); UpdateButtonCaption(); } private IDictionary DefaultButtonCaption = new Dictionary(); private void SetDynimcButtonLanguage() { foreach (var btn in _buttons.ToArray()) { if (LanLib.Current == LanLib.DefautLanguage) if (!DefaultButtonCaption.ContainsKey(btn.Name)) DefaultButtonCaption.Add(btn.Name, btn.Caption); //默认标题作为ObjectID,获取对应的语言 if (DefaultButtonCaption.ContainsKey(btn.Name)) btn.Caption = LanLib.Get(DefaultButtonCaption[btn.Name]); } } #endregion } }