麻烦哪位大哥帮忙把我解决一下,这个treeView获取父节点和子节点
using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace UI.Admin
{
public partial class Wwg_RoleAssignment : Form
{
public int role;
public Wwg_RoleAssignment()
{
InitializeComponent();
}
public MenuStrip MainMenu
{
get;
set;
}
//权限编辑状态
private bool powerEditState = false;
#region 权限编辑状态,true: 编辑状态,此时只有"取消设置"和"保存权限"按钮可用,false: 普通状态,此时只有"设置权限"按钮可用
/// <summary>
/// 权限编辑状态,true: 编辑状态,此时只有"取消设置"和"保存权限"按钮可用,false: 普通状态,此时只有"设置权限"按钮可用
/// </summary>
private bool IsPowerEditState
{
get
{
return powerEditState;
}
set
{
powerEditState = value;
//编辑状态
if (value)
{
tsbtnSetPower.Enabled = false;
tsbtnCancelPower.Enabled = true;
tsbtnSavePower.Enabled = true;
gbxPower.Enabled = false;
}
else //非编辑状态
{
tsbtnSetPower.Enabled = true;
tsbtnCancelPower.Enabled = false;
tsbtnSavePower.Enabled = false;
gbxPower.Enabled = true;
}
}
}
#endregion
#region 标志是否已处理过TreeView的AfterCheck事件,控制父节点和子节点不触发AfterCheck事件,防止无限递归
/// <summary>
/// 标志是否已处理过TreeView的AfterCheck事件,控制父节点和子节点不触发AfterCheck事件,防止无限递归
/// </summary>
private bool IsHandleAfterCheck = false;
#endregion
#region 加载Load窗体
/// <summary>
/// 加载Load窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Wwg_RoleAssignment_Load(object sender, EventArgs e)
{
// TODO: 这行代码将数据加载到表“guanguanitDataSet8.Wwg_UserRoleType”中。您可以根据需要移动或移除它。
this.wwg_UserRoleTypeTableAdapter.Fill(this.guanguanitDataSet8.Wwg_UserRoleType);
//InitPowerTree();
}
#endregion
#region 初始化权限树
/// <summary>
/// 初始化权限树
/// </summary>
private void InitPowerTree()
{
if (MainMenu == null)
{
throw new Exception("MainMenu属性不能为null,请在显示此窗体钱,给此属性赋值");
}
TreeNode rootNode = new TreeNode("权限设置");
rootNode.Tag = "-1";
tvPower.Nodes.Add(rootNode);
rootNode.Expand();
for (int i = 0; i < MainMenu.Items.Count; i++)
{
ToolStripMenuItem Item = MainMenu.Items[i] as ToolStripMenuItem;
TreeNode node = new TreeNode();
node.Text = Item.Text.Substring(0, Item.Text.Length - 4);
node.Tag = Item.Name;
rootNode.Nodes.Add(node);
AddChildMenu(Item, node);
}
}
#endregion
#region 添加子菜单项指定权限结点下
/// <summary>
/// 添加子菜单项指定权限结点下
/// </summary>
/// <param name="Item"></param>
/// <param name="node"></param>
private void AddChildMenu(ToolStripMenuItem Item, TreeNode parentNode)
{
for (int i = 0; i < Item.DropDownItems.Count; i++)
{
ToolStripMenuItem childItem = Item.DropDownItems[i] as ToolStripMenuItem;
if (childItem == null)
{
continue;
}
//不加载"注销"和"退出"
if (childItem.Name.Equals("tsmiCancelSystem") || childItem.Name.Equals("tsmiExitSystem"))
{
continue;
}
TreeNode node = new TreeNode();
node.Text = childItem.Text;
node.Text = childItem.Name;
parentNode.Nodes.Add(node);
//递归子子菜单
AddChildMenu(childItem, node);
}
}
#endregion
#region 更新节点复制选框后,修改其他节点的状态
/// <summary>
/// 更新节点复制选框后,修改其他节点的状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvPower_AfterCheck(object sender, TreeViewEventArgs e)
{
if (IsHandleAfterCheck)
{
return;
}
//已经处理过
IsHandleAfterCheck = true;
//修改其他节点状态
ChangeNodeState(e.Node);
//还原为未处理状态
IsHandleAfterCheck = false;
}
#endregion
#region 修改节点状态
/// <summary>
/// 修改节点状态
/// </summary>
/// <param name="node"></param>
private void ChangeNodeState(TreeNode node)
{
//遍历父节点
SetParentNode(node);
//遍历子节点
SetChildNode(node);
}
#endregion
#region 递归遍历设置所有父节点状态
/// <summary>
/// 递归遍历设置所有父节点状态
/// </summary>
/// <param name="node"></param>
private void SetChildNode(TreeNode node)
{
if (node.Parent != null)
{
if (node.Checked)
{
if (node.Parent.Checked) return;
node.Parent.Checked = true;
SetParentNode(node.Parent);
}
else
{
//标志是否所有兄弟节点都未选中
bool flag = false;
//遍历
foreach (TreeNode brotherNode in node.Parent.Nodes)
{
if (brotherNode.Checked)
{
flag = true;
break;
}
}
node.Parent.Checked = flag;
//遍历父节点的兄弟结点
SetParentNode(node.Parent);
}
}
}
#endregion
#region 递归遍历设置所有子节点状态
/// <summary>
/// 递归遍历设置所有子节点状态
/// </summary>
/// <param name="node"></param>
private void SetParentNode(TreeNode node)
{
foreach (TreeNode childNode in node.Nodes)
{
childNode.Checked = node.Checked;
SetChildNode(childNode);
}
}
#endregion
#region 如果非编辑状态,禁用编辑角色权限
/// <summary>
/// 如果非编辑状态,禁用编辑角色权限
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvPower_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
if (!IsPowerEditState)
{
e.Cancel = true;
}
}
#endregion
}
}
--------------------编程问答-------------------- --------------------编程问答-------------------- 麻烦哪位大哥帮忙解决一下吧,我真的急需要啊!
补充:.NET技术 , C#