#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;
|
|
/// <summary>
|
/// 构造器
|
/// </summary>
|
/// <param name="tree">树视图</param>
|
/// <param name="menuData">菜单数据</param>
|
public UserActionsView(TreeView tree)
|
{
|
_Tree = tree;
|
}
|
|
/// <summary>
|
/// 功能点的自定义名称数据
|
/// </summary>
|
public DataTable ActionCustomNameData
|
{
|
get => _MyFormTagName;
|
set => _MyFormTagName = value;
|
}
|
|
/// <summary>
|
/// 所有功能点数据
|
/// </summary>
|
public DataTable ActionsData
|
{
|
get => _Actions;
|
set => _Actions = value;
|
}
|
|
/// <summary>
|
/// 所有菜单数据
|
/// </summary>
|
public DataTable MenuData
|
{
|
get => _MenuData;
|
set => _MenuData = value;
|
}
|
|
/// <summary>
|
/// 用户的权限数据
|
/// </summary>
|
public DataTable UserActionData
|
{
|
get => _UserActionData;
|
set => _UserActionData = value;
|
}
|
|
/// <summary>
|
/// 由菜单的数据创建树结点
|
/// </summary>
|
/// <param name="row">菜单的数据</param>
|
/// <param name="tree">树视图</param>
|
/// <param name="parentNode">父级结点</param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 根据父级菜单名获取所有子级的资料行.
|
/// </summary>
|
/// <param name="parentValue">父级菜单名</param>
|
/// <returns></returns>
|
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 递归生成菜单树
|
|
/// <summary>
|
/// 生成顶级菜单的树结点
|
/// </summary>
|
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();
|
}
|
|
/// <summary>
|
/// 生成子菜单的树结构
|
/// </summary>
|
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 初始化功能点
|
|
/// <summary>
|
/// 初始化功能点树结点
|
/// </summary>
|
/// <param name="node"></param>
|
/// <param name="menuItem"></param>
|
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 递归选择结点父/子结点
|
|
/// <summary>
|
/// 勾选所有子级结点
|
/// </summary>
|
/// <param name="thChild">当前结点</param>
|
/// <param name="isChecked">是否勾选</param>
|
public void TreeNodeSelectedChild(TreeNode thChild, bool isChecked)
|
{
|
foreach (TreeNode tnChildNext in thChild.Nodes)
|
{
|
tnChildNext.Checked = isChecked;
|
TreeNodeSelectedChild(tnChildNext, isChecked);
|
}
|
}
|
|
/// <summary>
|
/// 勾选父级结点
|
/// </summary>
|
/// <param name="tnChild">当前结点</param>
|
/// <param name="isChecked">是否勾选</param>
|
private void TreeNodeParentSelected(TreeNode tnChild, bool isChecked)
|
{
|
if (tnChild.Parent != null)
|
{
|
tnChild.Parent.Checked = isChecked;
|
TreeNodeParentSelected(tnChild.Parent, isChecked);
|
}
|
}
|
|
/// <summary>
|
/// 当所有子结点去掉勾选时,父结点也去掉勾选时
|
/// </summary>
|
/// <param name="tnChild"></param>
|
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
|
}
|
}
|