当前位置:编程学习 > C#/ASP.NET >>

麻烦哪位大哥帮忙把我解决一下,这个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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,