#region using System.Data; using System.Windows.Forms; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Models; #endregion namespace CSFrameworkV5.Business.BLL_Permission { public class UserActionsView { protected DataTable _Actions; protected DataTable _MenuData; protected DataTable _MyFormTagName; protected TreeView _Tree; protected DataTable _UserActionData; /// /// 构造器 /// /// 树视图 /// 菜单数据 public UserActionsView(TreeView tree) { _Tree = tree; } /// /// 功能点的自定义名称数据 /// public DataTable ActionCustomNameData { get => _MyFormTagName; set => _MyFormTagName = value; } /// /// 所有功能点数据 /// public DataTable ActionsData { get => _Actions; set => _Actions = value; } /// /// 所有菜单数据 /// public DataTable MenuData { get => _MenuData; set => _MenuData = value; } /// /// 用户的权限数据 /// public DataTable UserActionData { get => _UserActionData; set => _UserActionData = value; } /// /// 由菜单的数据创建树结点 /// /// 菜单的数据 /// 树视图 /// 父级结点 /// protected TreeNode DataRow2NodeHandler(DataRow row, TreeView tree, TreeNode parentNode) { var node = new TreeNode(); node.Text = ConvertEx.ToString(row[tb_MyMenu.MenuCaption]); //显示菜单标题 if (parentNode != null) parentNode.Nodes.Add(node); else tree.Nodes.Add(node); return node; } /// /// 根据父级菜单名获取所有子级的资料行. /// /// 父级菜单名 /// protected DataRow[] GetRows(string parentMenuName) { string filter; if (string.IsNullOrEmpty(parentMenuName)) filter = string.Format("({0} IS NULL) OR ({1} ='')", tb_MyMenu.ParentMenuName, tb_MyMenu.ParentMenuName); else filter = string.Format("{0}='{1}'", tb_MyMenu.ParentMenuName, parentMenuName); return _MenuData.Select(filter); } #region 递归生成菜单树 /// /// 生成顶级菜单的树结点 /// public virtual void InitTree(string rootValue) { _Tree.Nodes.Clear(); _Tree.BeginUpdate(); //根结点记录 var rows = GetRows(rootValue); DataRow[] childs; string pValue; //parentValue; string kValue; //key value TreeNode root; foreach (var row in rows) { pValue = row[tb_MyMenu.ParentMenuName].ToStringEx(); kValue = row[tb_MyMenu.MenuName].ToStringEx(); if (!ExistsMenu(kValue)) continue; //用户有此菜单的权限 root = DataRow2NodeHandler(row, _Tree, null); //创建结点 root.ImageIndex = 0; root.SelectedImageIndex = 0; childs = GetRows(kValue); if (childs.Length > 0) InitTreeChild(childs, root); } _Tree.EndUpdate(); } /// /// 生成子菜单的树结构 /// protected virtual void InitTreeChild(DataRow[] childs, TreeNode parentNode) { string menuParentName; //当前菜单的父级菜单; string menuName; //当前菜单 TreeNode root; foreach (var row in childs) { menuParentName = row[tb_MyMenu.ParentMenuName].ToStringEx(); menuName = row[tb_MyMenu.MenuName].ToStringEx(); if (!ExistsMenu(menuName)) continue; //用户有此菜单的权限 root = DataRow2NodeHandler(row, _Tree, parentNode); //创建结点 var actions = GetMenuActions(ConvertEx.ToString(row[tb_MyMenu.MenuName])); if (actions > 0) //窗体有权限功能 { root.ImageIndex = 1; root.SelectedImageIndex = 1; InitAction(actions, menuName, root); //初始化功能结点 } else { root.ImageIndex = 3; root.SelectedImageIndex = 3; } childs = GetRows(menuName); if (childs.Length > 0) //创建下一级结点 InitTreeChild(childs, root); } } #endregion #region InitAction 初始化功能点 /// /// 初始化功能点树结点 /// /// /// protected virtual void InitAction(int actions, string menuName, TreeNode node) { var userAuths = actions; //当前用户的权限 foreach (DataRow row in _Actions.Rows) //循环所有功能点. { var value = ConvertEx.ToInt(row[tb_MyActions.ActionValue]); if (value == 0) continue; //用每个功能点的值与窗体的最大权限"与"运算, 但不能超出当前用户的权限. if ((value & actions) == value && (value & userAuths) == value) { var caption = ConvertEx.ToString(row[tb_MyActions.ActionName]); var tagNameRow = GetCustomTagName(menuName, value); //取按钮的自定义名称 if (tagNameRow != null) caption = ConvertEx.ToString( tagNameRow[ tb_MyFormTagName .TagName]); //功能点名称 var actionNode = new TreeNode(caption, 0, 0); actionNode.ImageIndex = 2; actionNode.SelectedImageIndex = 2; var tag = new ActionNodeTag(value); tag.TagMenuName = menuName; tag.TagNameDataRow = tagNameRow; tag.TagNameOld = caption; //按钮标题 actionNode.Tag = tag; node.Nodes.Add(actionNode); } } } protected DataRow GetCustomTagName(string menuName, int actionValue) { var rows = _MyFormTagName.Select("MenuName='" + menuName + "' AND TagValue=" + actionValue.ToStringEx()); if (rows.Length > 0) return rows[0]; return null; } private int GetMenuActions(string menuName) { var rs = _UserActionData.Select("MenuName='" + menuName + "'"); return rs.Length > 0 ? ConvertEx.ToInt(rs[0]["ActionValue"]) : 0; } private bool ExistsMenu(string menuName) { var rs = _UserActionData.Select("MenuName='" + menuName + "'"); return rs.Length > 0; } #endregion #region 递归选择结点父/子结点 /// /// 勾选所有子级结点 /// /// 当前结点 /// 是否勾选 public void TreeNodeSelectedChild(TreeNode thChild, bool isChecked) { foreach (TreeNode tnChildNext in thChild.Nodes) { tnChildNext.Checked = isChecked; TreeNodeSelectedChild(tnChildNext, isChecked); } } /// /// 勾选父级结点 /// /// 当前结点 /// 是否勾选 private void TreeNodeParentSelected(TreeNode tnChild, bool isChecked) { if (tnChild.Parent != null) { tnChild.Parent.Checked = isChecked; TreeNodeParentSelected(tnChild.Parent, isChecked); } } /// /// 当所有子结点去掉勾选时,父结点也去掉勾选时 /// /// private void TreeNodeChildsUnSelected(TreeNode tnChild) { if (tnChild.Parent == null) return; foreach (TreeNode n in tnChild.Parent.Nodes) if (n.Checked) return; tnChild.Parent.Checked = false; } #endregion } }