using System; using System.Collections.Generic; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using UAS_MES_NEW.DataOperate; using UAS_MES_NEW.Entity; using DevExpress.XtraNavBar; using System.Collections; using System.Reflection; namespace UAS_MES_NEW.CustomControl.AccordionMenu { public partial class NavagationBar : NavBarControl { StringBuilder sql = new StringBuilder(); public static int WinIndex = 0; /// /// 记录当前功能面板中的按钮 /// private ArrayList ArrFunButton = new ArrayList(); /// /// 记录当前功能面板中的listview /// private ArrayList ArrFunListView = new ArrayList(); /// /// 已经打开的Form /// public static Dictionary OpenedFormName = new Dictionary(); public NavagationBar() { InitializeComponent(); DataHelper dh = SystemInf.dh; if (dh == null) return; if (User.UserAccountType == "admin") { sql.Clear(); sql.Append("select distinct sn_id,sn_detno,sn_module,sn_modulecode,sn_classname,sn_displayname,sn_displayname_en,sn_displayname_ynan,sn_displayname_yni,sn_caller ugp_caller,1 ugp_ifdelete,1 ugp_ifread,1 ugp_ifspecial,1 ugp_ifall,"); sql.Append("1 ugp_ifwrite from CS$SYSNAVATION left join CS$USERGROUPPOWER on sn_caller=ugp_caller where sn_using=1 order by sn_modulecode,sn_detno"); } else { sql.Clear(); sql.Append("select sn_id,sn_detno,sn_module,sn_displayname,sn_displayname_en,sn_displayname_ynan,sn_displayname_yni,sn_modulecode,sn_classname,ugp_caller,max(ugp_ifdelete)ugp_ifdelete,max(ugp_ifread)ugp_ifread"); sql.Append(",max(ugp_ifspecial)ugp_ifspecial,max(ugp_ifwrite)ugp_ifwrite,max(ugp_ifall)ugp_ifall from CS$USERGROUPPOWER "); sql.Append("left join CS$SYSNAVATION on sn_caller=ugp_caller where sn_using=1 and ugp_groupcode in ( select eg_groupcode from cs$empgroup "); sql.Append("left join cs$userresource on ur_groupcode = eg_groupcode where eg_emcode = '" + User.UserCode + "') and (nvl(ugp_ifread,0)<>0 or nvl(ugp_ifall,0)<>0) group by sn_id,sn_caller,sn_detno,sn_modulecode,sn_classname,sn_module,sn_displayname,sn_displayname_en,sn_displayname_ynan,sn_displayname_yni,ugp_caller order by sn_modulecode,sn_detno"); } DataTable dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select"); if (dt.Rows.Count == 0 && User.UserAccountType != "admin") { return; } //模块分组缓存:key=数据库原始中文模块名(sn_module)。 //注意:不能用翻译后的组名(Caption)做去重比较,否则非中文语言下 //Caption(如"Line Operations")与 sn_module(如"产线作业")永远不等, //会导致每行菜单都新建一个分组(每组只有一条菜单项)。 Dictionary GroupMap = new Dictionary(); for (int i = 0; i < dt.Rows.Count; i++) { string module_name = dt.Rows[i]["sn_module"].ToString(); string caller = GetMenuDisplayName(dt.Rows[i]); NavBarItem nbi = new NavBarItem(caller); nbi.Tag = dt.Rows[i]["sn_classname"].ToString(); nbi.LinkClicked += Nbi_LinkClicked; nbi.Hint = dt.Rows[i]["ugp_caller"].ToString(); nbi.Name = dt.Rows[i]["sn_id"].ToString(); NavBarGroup nbg; if (GroupMap.TryGetValue(module_name, out nbg)) { //已存在该模块分组,按权限添加菜单项 if (dt.Rows[i]["ugp_ifread"].ToString() != "0" || dt.Rows[i]["ugp_ifall"].ToString() != "0") { nbg.ItemLinks.Add(nbi); } } else { //新建分组:标题用当前语言翻译(Lang.xml 兜底),去重用原始模块名 nbg = new NavBarGroup(UAS_MES_NEW.I18n.LanguageManager.T(module_name)); //如果加载Icon失败则加载默认图片 try { nbg.LargeImage = new Bitmap(@Application.StartupPath + "/Resources/" + dt.Rows[i]["sn_module"].ToString() + ".png"); } catch (Exception) { try { nbg.LargeImage = new Bitmap(@Application.StartupPath + "/Resources/defaulticon.png"); } catch (Exception) { nbg.ImageUri = null; } } Groups.Add(nbg); GroupMap[module_name] = nbg; nbg.ItemLinks.Add(nbi); } } //查询出的用户可见的Caller //将查询出的数据添加到队列中 for (int i = 0; i < dt.Rows.Count; i++) { //添加权限 Dictionary dic = new Dictionary(); dic.Add("IFDELETE", dt.Rows[i]["UGP_IFDELETE"].ToString() != "1" ? false : true); dic.Add("IFREAD", dt.Rows[i]["UGP_IFREAD"].ToString() != "1" ? false : true); dic.Add("IFWRITE", dt.Rows[i]["UGP_IFWRITE"].ToString() != "1" ? false : true); dic.Add("IFSPECIAL", dt.Rows[i]["UGP_IFSPECIAL"].ToString() != "1" ? false : true); dic.Add("IFALL", dt.Rows[i]["UGP_IFALL"].ToString() != "1" ? false : true); //之后通过Call来获取页面操作的权限 if (SystemInf.Caller.ContainsKey(dt.Rows[i]["ugp_caller"].ToString())) { SystemInf.Caller.Remove(dt.Rows[i]["ugp_caller"].ToString()); } SystemInf.Caller.Add(dt.Rows[i]["ugp_caller"].ToString(), dic); } } private void Nbi_LinkClicked(object sender, NavBarLinkEventArgs e) { NavBarItem nbi = (sender as NavBarItem); Form OpenForm = (Form)Assembly.GetExecutingAssembly().CreateInstance("UAS_MES_NEW." + nbi.Tag.ToString()); //if (nbi.Tag.ToString() != "Query.Query_MacAddress") //{ // DataTable dt = (DataTable)SystemInf.dh.ExecuteSql("select * from DeviceMacAddress where dma_mac='" + SystemInf.MacAddress + "'", "select"); // if (dt.Rows.Count == 0) // { // MessageBox.Show(UAS_MES_NEW.I18n.LanguageManager.T("该设备不在作业设备清单中,请先上传MAC以及设备信息")); // return; // } //} OpenForm.Dock = DockStyle.Fill; OpenForm.Text = nbi.Caption; //用Tag保存Caller OpenForm.Tag = nbi.Hint; TabControl tc = (TabControl)this.Parent.Controls["MainTabControl"]; //如果窗体不存在进行打开,item.ToolTip是Caller if (!OpenedFormName.ContainsKey(nbi.Hint)) { TabPage tb = new TabPage { Name = nbi.Name, Tag = nbi.Hint, Text = OpenForm.Text }; OpenForm.TopLevel = false; tc.TabPages.Add(tb); //直接选中新打开的界面 tc.SelectedTab = tb; tb.Controls.Add(OpenForm); OpenedFormName.Add(nbi.Hint, WinIndex); tc.TabIndex = WinIndex; WinIndex++; OpenForm.Show(); } //如果窗体已存在展示该窗体 else tc.SelectTab(nbi.Name); } /// /// 根据当前界面语言,从 CS$SYSNAVATION 行读取对应语言的菜单名称。 /// 语言字段为空时回退到中文 sn_displayname。 /// private static string GetMenuDisplayName(System.Data.DataRow row) { string field; switch (UAS_MES_NEW.I18n.LanguageManager.CurrentCulture) { case "en": field = "sn_displayname_en"; break; case "vi": field = "sn_displayname_ynan"; break; case "id": field = "sn_displayname_yni"; break; default: field = "sn_displayname"; break; } object val = row[field]; if (val != null && !string.IsNullOrWhiteSpace(val.ToString())) return val.ToString(); // 回退到中文 object zh = row["sn_displayname"]; return zh == null ? string.Empty : zh.ToString(); } } }