用树形结构分配权限
来源:互联网 发布:java教程 菜鸟教程下载 编辑:程序博客网 时间:2024/06/03 17:49
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
//引用的命名空间
using System.Data.SqlClient;
using MBCODE.DataClass;
namespace MBCODE
{
public partial class PowerTree :UserControl
{
//定义左边的权限树的集合表
static DataTable noPowers = new DataTable();
//定义右边的权限树的集合表
static DataTable beingPowers = new DataTable();
//定义集合表的结构
static DataTable dtStruct = new DataTable();
//定义用户列表集
static DataTable userList = new DataTable();
//判断用户初始调用那个权限表
static int initialPower;
public PowerTree(Control container)
{
container.SuspendLayout();
InitializeComponent();
this.Dock = DockStyle.Fill;
container.Controls.Add(this);
container.ResumeLayout(false);
container.PerformLayout();
//加载部门列表
Dept_Cbo.Items.Clear();
foreach (DataRow dr in GetDeptList().Rows)
{
Dept_Cbo.Items.Add(dr["deptName"].ToString());
}
//加载所有的员工列表集
userList = GetUserByDeptList().Clone();
foreach (DataRow dr in GetUserByDeptList().Rows)
{
userList.ImportRow(dr);
}
}
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PowerTree_Load(object sender, EventArgs e)
{
//加载用户的权限
this.btn_user_power_LeftMove.Visible = MBClass.IfHavePower(this.btn_user_power_LeftMove.Name);
this.btn_user_power_RightMove.Visible = MBClass.IfHavePower(this.btn_user_power_RightMove.Name);
this.btn_user_power_AllLeftMove.Visible = MBClass.IfHavePower(this.btn_user_power_AllLeftMove.Name);
this.btn_user_power_AllRightMove.Visible = MBClass.IfHavePower(this.btn_user_power_AllRightMove.Name);
this.btn_user_power_Save.Visible = MBClass.IfHavePower(this.btn_user_power_Save.Name);
}
/// <summary>
/// 用户选择框的单击选择事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Users_Cbo_SelectedIndexChanged(object sender, EventArgs e)
{
#region
//首先清除两边树的所有结点
left_tree.Nodes.Clear();
right_tree.Nodes.Clear();
String userNo = Users_Cbo.Text.Replace("'", "").Trim();
userNo = userNo.IndexOf('(') != -1 ? userNo.Substring(0, userNo.IndexOf('(')):userNo;
//首先判断当前登陆用户的等级是否在选择用户之上
object[] drr = userList.Rows.Find(userNo).ItemArray;
//登陆的员工号以及用户等级
string loginUserNo = MBClass.UserInfoStaticList.Rows[0][0].ToString();
int loginUserLevelNo = Convert.ToInt32(MBClass.UserInfoStaticList.Rows[0][11].ToString());
//选择的员工号以及用户等级
string CurrenUserNo = drr[0].ToString();
int currenLevelNo = Convert.ToInt32(drr[11].ToString());
if ((loginUserLevelNo <= currenLevelNo) && (CurrenUserNo != loginUserNo))
{
//登陆员工号的等级不大于选择员工号的等级时
MessageBox.Show("你的用户等级不在当前选择的用户等级之上!", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
return;
}
noPowers =GetCanSetPowers(userNo);
//用来排序
DataView dv = noPowers.DefaultView;
dv.Sort = "powerNo ASC";
noPowers = dv.ToTable();
noPowers.PrimaryKey = new DataColumn[] { noPowers.Columns["powerNo"] };
CreateTree(left_tree.Nodes, 0, noPowers);
left_tree.ExpandAll();
//获取用户已拥有的权限集合填充已授予权限树
beingPowers = GetBeingPowers(userNo);
//用来克隆集合表的结构
if (noPowers.Rows.Count > 0)
{
dtStruct = noPowers.Clone();
foreach (DataRow dr in noPowers.Select())
{
dtStruct.ImportRow(dr);
}
dtStruct.AcceptChanges();
}
else
{
dtStruct = beingPowers.Clone();
foreach (DataRow dr in beingPowers.Select())
{
dtStruct.ImportRow(dr);
}
dtStruct.AcceptChanges();
}
DataView dvv = beingPowers.DefaultView;
dvv.Sort = "powerNo ASC";
beingPowers = dvv.ToTable();
beingPowers.PrimaryKey = new DataColumn[] { beingPowers.Columns["powerNo"] };
CreateTree(right_tree.Nodes,0,beingPowers);
right_tree.ExpandAll();
#endregion
}
#region
/// <summary>
/// 获取部门列表
/// </summary>
/// <returns></returns>
private static DataTable GetDeptList()
{
DataSet dst;
using (SqlConnection conn =MBClass.GetSqlConnection())
{
SqlDataAdapter sda = new SqlDataAdapter("select * from com_dept", conn);
dst = new DataSet();
sda.Fill(dst);
sda.Dispose();
}
//dst.Tables[0].PrimaryKey = new DataColumn[] { dst.Tables[0].Columns["deptName"] };
return dst.Tables[0];
}
/// <summary>
/// 获取对应部门在职的员工列表
/// </summary>
/// <returns></returns>
private static DataTable GetUserByDeptList()
{
DataSet dst;
using (SqlConnection conn = MBClass.GetSqlConnection())
{
//注意离职的员工不载入
SqlDataAdapter sda = new SqlDataAdapter("select * from com_user where activeFlag=0", conn);
dst = new DataSet();
sda.Fill(dst);
sda.Dispose();
}
//设置主键
userList.PrimaryKey = new DataColumn[] { userList.Columns["userNo"] };
return dst.Tables[0];
}
/// <summary>
/// 用户没有赋权限时后面加上“末授权”
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
public static bool HaveUserPower(string userNo)
{
int num = 0;
using (SqlConnection conn = MBClass.GetSqlConnection())
{
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@userNo", SqlDbType.VarChar, 20).Value = userNo;
cmd.CommandText = "haveUserPower";
cmd.Connection = conn;
conn.Open();
num = Convert.ToInt32(cmd.ExecuteScalar());
if (num != 0)
{
conn.Close();
conn.Dispose();
return true;
}
else
{
conn.Close();
conn.Dispose();
return false;
}
}
}
/// <summary>
/// 用于实时刷新用户是否授权
/// </summary>
private void IfHaveUserPower()
{
//清除用户列表
Users_Cbo.Text = string.Empty;
Users_Cbo.Items.Clear();
foreach (DataRow dr in GetDeptList().Rows)
{
//根据部门的名称来对应到部门的ID号,再根据ID号来对应该门的所有员工
if (dr["deptName"].ToString() == this.Dept_Cbo.Text.Trim())
{
foreach (DataRow drr in userList.Rows)
{
if (drr["deptNo"].ToString() == dr["deptNo"].ToString())
{
if (HaveUserPower(drr["userNo"].ToString()))
{
Users_Cbo.Items.Add(drr["userNo"].ToString() + "(" + drr["userName"].ToString() + ")");
}
else
{
Users_Cbo.Items.Add(drr["userNo"].ToString() + "(" + drr["userName"].ToString() + ")" + "末授权");
}
}
}
Users_Cbo.DroppedDown = true;
}
}
}
/// <summary>
/// 为指定的节点集合中添加该层节点
/// </summary>
/// <param name="nodes"></param>
/// <param name="parentid"></param>
/// <param name="powers"></param>
private void CreateTree(TreeNodeCollection nodes, int parentid, DataTable powers)
{
TreeNode node = null;
for (int i = 0; i < powers.Rows.Count; i++)
{
if (Convert.ToInt32(powers.Rows[i]["parent"].ToString())==parentid)
{
node = new TreeNode(powers.Rows[i]["powerName"].ToString());
node.Name = powers.Rows[i]["powerNo"].ToString();
node.Tag = powers.Rows[i];
//深度优先
CreateTree(node.Nodes,Convert.ToInt32(powers.Rows[i]["powerNo"].ToString()), powers);
nodes.Add(node);
}
}
}
#endregion
#region 调用的方法
/// <summary>
/// 获取未制授权的权限集
/// </summary>
/// <param name="userNo"></param>
/// <returns></returns>
private static DataTable GetCanSetPowers(string userNo)
{
//获取所有权限列表
DataTable powers = GetPowers();
//获取指定用户的可用权限列表
DataTable bPowers = GetBeingPowers(userNo);
RemoveAll(powers, bPowers);
return powers;
}
/// <summary>
/// 从母集合中移除子集合中存在的所有元素
/// </summary>
/// <param name="fullC"></param>
/// <param name="childC"></param>
private static void RemoveAll(DataTable fullC, DataTable childC)
{
//从所有权限中排除已有权限
DataTable roots = FilterPowers(fullC, 0);
Remove(fullC, roots, childC);
}
/// <summary>
/// 筛选出指定父权限号的新集合
/// </summary>
/// <param name="list"></param>
/// <param name="parentid"></param>
/// <returns></returns>
private static DataTable FilterPowers(DataTable list, int parentid)
{
DataTable nodes = new DataTable();
nodes = list.Clone();
//保存指定父节点权限列表
for (int i = 0; i < list.Rows.Count; i++)
{
if (Convert.ToInt32(list.Rows[i]["parent"].ToString()) == parentid)
{
nodes.ImportRow((DataRow)list.Rows[i]);
nodes.AcceptChanges();
}
}
return nodes;
}
/// <summary>
///遍历所有权限,如果某项权在已授权限集合中,且无下级权限则,则移除,否则,递归遍历该权限项的所有子权限,如果存在已授权限集合中,则移除
/// </summary>
/// <param name="powers"></param>
/// <param name="list"></param>
/// <param name="beingPowers"></param>
public static void Remove(DataTable powers, DataTable list, DataTable beingPowers)
{
try
{
for (int i = 0; i < list.Rows.Count; i++)
{
//SysPower power = list[i];
//DataRow power = list.Rows[i] as DataRow;
string powerNo = list.Rows[i]["powerNo"].ToString();
for (int j = 0; j < beingPowers.Rows.Count; j++)
{
if (beingPowers.Rows[j]["powerNo"].ToString() == powerNo)
{
DataTable childs = FilterPowers(powers, Convert.ToInt32(powerNo));
Remove(powers, childs, beingPowers);
if (childs.Rows.Count < 1)
{
//powers.Rows[i].Delete();
for (int l = 0; l < powers.Rows.Count; l++)
{
if (powers.Rows[l]["powerNo"].ToString() == powerNo)
{
powers.Rows[l].Delete();
powers.AcceptChanges();
l--;
}
}
list.Rows[i].Delete();
list.AcceptChanges();
i--;
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 获得所有权限
/// </summary>
/// <returns></returns>
private static DataTable GetPowers()
{
DataSet ds;
using (SqlConnection conn = MBClass.GetSqlConnection())
{
SqlDataAdapter sda = new SqlDataAdapter("select powerNo,parent,powerName,classString,powerLevel from com_syspower order by parent,powerno", conn);
ds = new DataSet();
sda.Fill(ds);
sda.Dispose();
}
ds.Tables[0].PrimaryKey = new DataColumn[] { ds.Tables[0].Columns["powerNo"] };
return ds.Tables[0];
}
/// <summary>
/// 获得用户的权限
/// </summary>
/// <param name="userNo"></param>
/// <returns></returns>
private static DataTable GetBeingPowers(string userNo)
{
//调用初始表还是用户权限表
string initialSql = string.Empty;
//判断该用户是否已经授权,若已经授权则调用已授的权限,反之调用该用户级别的初始权限
using (SqlConnection con = MBClass.GetSqlConnection())
{
try
{
con.Open();
SqlCommand cmd = new SqlCommand("select count(*) from com_user_power where userNo='"+userNo+"'",con);
initialPower= (int)cmd.ExecuteScalar();
}
catch (SqlException ex)
{
MessageBox.Show("判断是否调用用户的初始权限时:"+ex.Message);
}
}
DataSet ds;
using (SqlConnection conn = MBClass.GetSqlConnection())
{
if (initialPower > 0)
{
initialSql = "SELECT powerNo,parent,powerName,classString,powerLevel FROM com_syspower WHERE powerNo in (SELECT powerNo FROM com_user_power WHERE userNo ='" + userNo + "') ORDER BY parent,powerno";
}
else
{
initialSql = "select powerNo,parent,powerName,classString,powerLevel from com_user_initialpower where userNo='" + userNo + "'";
}
SqlDataAdapter sda = new SqlDataAdapter(initialSql, conn);
ds = new DataSet();
sda.Fill(ds);
sda.Dispose();
}
ds.Tables[0].PrimaryKey = new DataColumn[] { ds.Tables[0].Columns["powerNo"] };
return ds.Tables[0];
}
#endregion
#region 处理树的勾选
private void left_tree_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action == TreeViewAction.ByMouse)
{
try
{
//设置复选框状态
SetTreeCheckBoxState(e.Node);
}
catch (Exception ex)
{
MessageBox.Show("左树复选框选择处理发生异常,原因:" + ex.Message);
}
}
}
private void right_tree_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action == TreeViewAction.ByMouse)
{
try
{
//设置复选框状态
SetTreeCheckBoxState(e.Node);
}
catch (Exception ex)
{
MessageBox.Show("右树复选框选择处理发生异常,原因:" + ex.Message);
}
}
}
/// <summary>
/// 设置指定节点与相关节点复选框状态
/// </summary>
/// <param name="SelectNode"></param>
private void SetTreeCheckBoxState(TreeNode SelectNode)
{
if (SelectNode.Checked)
{
//设置所有子节点为选中状态
setChildNodeCheckedState(SelectNode, true);
//如果节点存在父节点,并且所有子节点的被选中,那么将选中父节点
if (SelectNode.Parent != null)
{
setParentNodeCheckedState(SelectNode.Parent, true);
}
}
else
{
//取消节点选中状态之后,取消所有父节点的选中状态
setChildNodeCheckedState(SelectNode, false);
//如果节点存在父节点,取消父节点的选中状态
if (SelectNode.Parent != null)
{
setParentNodeCheckedState(SelectNode, false);
}
}
}
/// <summary>
/// 递归向下选中指定节点的所有子节点
/// </summary>
/// <param name="currNode"></param>
/// <param name="state"></param>
private void setChildNodeCheckedState(TreeNode currNode, bool state)
{
TreeNodeCollection nodes = currNode.Nodes;
if (nodes.Count > 0)
{
foreach (TreeNode tn in nodes)
{
tn.Checked = state;
setChildNodeCheckedState(tn, state);
}
}
}
/// <summary>
/// 递归向上设置指定节点的所有上级节点复选框状态,
/// </summary>
/// <param name="currNode"></param>
/// <param name="state"></param>
private void setParentNodeCheckedState(TreeNode currNode, bool state)
{
if (state)
{
bool flag = true;
foreach (TreeNode node in currNode.Nodes)
{
if (!node.Checked)
{
flag = false;
break;
}
}
if (flag)
{
currNode.Checked = true;
TreeNode parent = currNode.Parent;
if (parent != null) setParentNodeCheckedState(parent, state);
}
}
else
{
currNode.Checked = false;
TreeNode parent = currNode.Parent;
if (parent != null) setParentNodeCheckedState(parent, state);
}
}
#endregion
/// <summary>
/// 保存按钮事件 保存树根到数据库中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SavePower_bt_Click(object sender, EventArgs e)
{
#region
if (Users_Cbo.SelectedIndex == -1)
{
return;
}
String userNo = Users_Cbo.Text.Replace("'", "").Trim();
userNo = userNo.IndexOf('(') != -1 ? userNo.Substring(0, userNo.IndexOf('(')) : userNo;
if (initialPower > 0)
{
if (btn_user_power_Save.Tag == null)
{
MessageBox.Show("未进行过授权操作", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Question);
return;
}
}
//先删除用户的权限再保存新的授权
using (SqlConnection con = MBClass.GetSqlConnection())
{
con.Open();
//开始事务
SqlTransaction delSqlTran = con.BeginTransaction();
SqlCommand delCmd = new SqlCommand("delete com_user_power where userNo='" + userNo + "' ", con);
//事务对像分配给command的transaction属性
delCmd.Transaction = delSqlTran;
try
{
delCmd.ExecuteNonQuery();
//事务的提交
delSqlTran.Commit();
}
catch (SqlException ex)
{
//事务的回滚
delSqlTran.Rollback();
MessageBox.Show("删除用户原有的权限时发生异常:" + ex.Message);
}
}
//保存新的授权到数据库中
DataTable datas = new DataTable();
datas = dtStruct.Clone();
AddChildTreeData(this.right_tree.Nodes, datas);
using (SqlConnection conn = MBClass.GetSqlConnection())
{
conn.Open();
//启动一个事务
SqlTransaction sqlTran = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
//将transaction对象分配给要执行的command的transaction属性
cmd.Transaction = sqlTran;
try
{
foreach (DataRow dr in datas.Rows)
{
cmd.CommandText = "insert into com_user_power values('" + userNo + "','" + dr["powerNo"].ToString() + "')";
cmd.ExecuteNonQuery();
}
//提交事务
sqlTran.Commit();
left_tree.Nodes.Clear();
right_tree.Nodes.Clear();
Users_Cbo.Text = "";
btn_user_power_Save.Tag = null;
MessageBox.Show("授权成功!", "恭喜你:", MessageBoxButtons.OK, MessageBoxIcon.Information);
IfHaveUserPower();
}
catch (SqlException ex)
{
//出现异常事务回滚
sqlTran.Rollback();
MessageBox.Show("授权不成功,原因:" + ex.Message);
}
}
#endregion
}
/// <summary>
/// 获取节点集合及子树的数据集合
/// </summary>
/// <param name="nodes"></param>
/// <param name="datas"></param>
private void AddChildTreeData(TreeNodeCollection nodes, DataTable datas)
{
foreach (TreeNode node in nodes)
{
DataRow power = (DataRow)node.Tag;
if (datas.Rows.Count < 1)
{
datas.ImportRow(power);
datas.AcceptChanges();
}
else
{
if(!datas.Rows.Contains(power["powerNo"].ToString()))
{
datas.ImportRow(power);
datas.AcceptChanges();
}
}
if (node.GetNodeCount(true) > 0)
{
AddChildTreeData(node.Nodes, datas);
}
}
}
/// <summary>
/// 将所有选中节点的数据添加到集合
/// </summary>
/// <param name="nodes"></param>
/// <param name="datas"></param>
private void GetMovedData(TreeNodeCollection nodes, DataTable datas)
{
foreach (TreeNode sourceNode in nodes)
{
if (sourceNode.Checked)
{
//如当前的选中的是根结点--则把所有当前根结点的所有权限转到所要转到的权限树中
AddParentData(sourceNode, datas);
DataRow p = (DataRow)sourceNode.Tag;
if (!datas.Rows.Contains(p["powerNo"].ToString()))
{
datas.ImportRow(p);
datas.AcceptChanges();
}
AddChildTreeData(sourceNode.Nodes, datas);
//移除该子树
sourceNode.Remove();
}
else
{
//深度递归
if (sourceNode.GetNodeCount(true) > 0)
GetMovedData(sourceNode.Nodes, datas);
}
}
}
/////改变数据重新加载tree
private void AddParentData(TreeNode node, DataTable datas)
{
TreeNode parent = node.Parent;
//表示当前不是根结点是子结点--把子结点转到所要转到的权限树中,然后再向上循环,
//看当前子结点的父结点是否在所要转到的树根树中,然后是否要转到的所要转到的树根树中--再以此向上循环
if (parent != null)
{
DataRow power = (DataRow)parent.Tag;
if (!datas.Rows.Contains(power["powerNo"].ToString()))
{
datas.ImportRow(power);
datas.AcceptChanges();
}
AddParentData(parent, datas);
}
}
#region 四个权限分配按钮事件
/// <summary>
/// 把左边树选中的权限移除到右边的权限树中 >
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RightMove_Bt_Click(object sender, EventArgs e)
{
if (left_tree.Nodes.Count < 1)
{
return;
}
try
{
btn_user_power_Save.Tag = "edit";
//if (beingPowers.Rows.Count < 1)
//{
DataTable datas = new DataTable();
datas = dtStruct.Clone();
//将右移前的数据添加到集合
AddChildTreeData(right_tree.Nodes, datas);
//将Left树的选中节点数据添加到集合
GetMovedData(left_tree.Nodes, datas);
right_tree.Nodes.Clear();
DataView dv = datas.DefaultView;
dv.Sort = "powerNo ASC";
datas = dv.ToTable();
datas.PrimaryKey = new DataColumn[] { datas.Columns["powerNo"] };
CreateTree(right_tree.Nodes, 0, datas);
right_tree.ExpandAll();
//}
//else
//{
// GetMovedData(left_tree.Nodes, beingPowers);
// right_tree.Nodes.Clear();
// CreateTree(right_tree.Nodes, 0, beingPowers);
// right_tree.ExpandAll();
//}
}
catch (Exception ex)
{
MessageBox.Show("右移权限时发生异常,原因:" + ex.Message);
}
}
/// <summary>
/// 取消权限按钮 <
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LeftMove_Bt_Click(object sender, EventArgs e)
{
if (right_tree.Nodes.Count < 1)
{
return;
}
try
{
btn_user_power_Save.Tag = "edit";
//if (noPowers.Rows.Count < 1)
//{
DataTable datas = new DataTable();
datas = dtStruct.Clone();
//将左移前的数据添加到集合
AddChildTreeData(left_tree.Nodes, datas);
//将Right树的选中节点数据添加到集合
GetMovedData(right_tree.Nodes, datas);
left_tree.Nodes.Clear();
DataView dv = datas.DefaultView;
dv.Sort = "powerNo ASC";
datas = dv.ToTable();
datas.PrimaryKey = new DataColumn[] { datas.Columns["powerNo"] };
CreateTree(left_tree.Nodes, 0, datas);
left_tree.ExpandAll();
//}
//else
//{
// GetMovedData(right_tree.Nodes, noPowers);
// left_tree.Nodes.Clear();
// CreateTree(left_tree.Nodes, 0, noPowers);
// left_tree.ExpandAll();
//}
}
catch (Exception ex)
{
MessageBox.Show("左移权限时发生异常,原因:" + ex.Message);
}
}
/// <summary>
/// 赋全部权限按钮 >>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AllRightMove_Bt_Click(object sender, EventArgs e)
{
if (left_tree.Nodes.Count < 1)
{
return;
}
try
{
btn_user_power_Save.Tag = "edit";
DataTable datas = new DataTable();
datas = dtStruct.Clone();
//将左移前的数据添加到集合
AddChildTreeData(left_tree.Nodes, datas);
//将右移前的数据添加到集合
AddChildTreeData(right_tree.Nodes, datas);
left_tree.Nodes.Clear();
right_tree.Nodes.Clear();
DataView dv = datas.DefaultView;
dv.Sort = "powerNo ASC";
datas = dv.ToTable();
datas.PrimaryKey = new DataColumn[] { datas.Columns["powerNo"] };
CreateTree(right_tree.Nodes, 0, datas);
right_tree.ExpandAll();
}
catch (Exception ex)
{
MessageBox.Show("右移全部权限时发生异常,原因:" + ex.Message);
}
}
/// <summary>
/// 取消全部权限按钮 <<
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AllLeftMove_Bt_Click(object sender, EventArgs e)
{
if (right_tree.Nodes.Count < 1)
{
return;
}
try
{
btn_user_power_Save.Tag = "edit";
DataTable datas = new DataTable();
datas = dtStruct.Clone();
AddChildTreeData(left_tree.Nodes, datas);
AddChildTreeData(right_tree.Nodes, datas);
left_tree.Nodes.Clear();
right_tree.Nodes.Clear();
DataView dv = datas.DefaultView;
dv.Sort = "powerNo ASC";
datas = dv.ToTable();
datas.PrimaryKey = new DataColumn[] { datas.Columns["powerNo"] };
CreateTree(left_tree.Nodes, 0, datas);
left_tree.ExpandAll();
}
catch (Exception ex)
{
MessageBox.Show("左移全部权限时发生异常,原因:" + ex.Message);
}
}
#endregion
/// <summary>
/// 部门选择框的单击选择事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Dept_Cbo_SelectedIndexChanged(object sender, EventArgs e)
{
IfHaveUserPower();
}
}
}
- 用树形结构分配权限
- 用LaTeX画树形结构
- 用结构数组仿树形结构
- Linux用树形结构显示目录结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 树形结构
- 权限分配
- 权限管理--------分配权限
- 组织结构树形结构
- 用存储过程显示树形结构
- android 用ListVew实现树形结构菜单
- Android SAX解析实例教程
- Oracle 高 Version counts 问题说明
- 花生壳已经激活了,但是在诊断显示“花生壳未激活,设置A记录”如何处理
- 分享前端网站模板,HTML5的响应式设计模板
- Oracle SQL Parsing Flow Diagram(SQL 解析流程图)
- 用树形结构分配权限
- Oracle自定义聚集函数
- 近两个月内,国内电子商务公司纷纷裁员
- Android SAX解析xml文件
- Python的Django的配置过程
- Oracle Namespace 说明
- cPanel安装ecshop的问题
- Oracle 查看 Shared Pool 信息的相关脚本
- java图片文字水印、图片水印、缩放、补白处理