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