WinForm TreeView的一点用法

简介: TreeView一般都包含父节点和子节点,常规情况下有以下几种情况:1.选中父节点之后,该父节点下面的所有子节点都被选中,取消选择父节点,则该父节点下面所有的子节点全部跟着取消选择。 2.如果某一个父节点下面有任何一个子节点被选中,那么该父节点也是处于选中状态。

TreeView一般都包含父节点和子节点,常规情况下有以下几种情况:
1.选中父节点之后,该父节点下面的所有子节点都被选中,取消选择父节点,则该父节点下面所有的子节点全部跟着取消选择。

2.如果某一个父节点下面有任何一个子节点被选中,那么该父节点也是处于选中状态。

3.如果某一个父节点下面最后一个处于选中的子节点被取消选中的话(这句话貌似有点绕口),该父节点也要处于取消选中的状态。

4.页面首先将所有的数据加载到TreeView上面,然后TreeView根据不同的情况做出相应的调整,比如选择Admin组别的时候勾选所有的选项,勾选User组别的时候仅仅勾选允许登录的选项。

前面3种情况可以如下解决:

private bool m_SetClick = true;
        
        private void SetSubNodeCheck(TreeNode p_TreeNode, bool p_SelectCheck)
        {
            m_SetClick = false;
            foreach (TreeNode _SubNode in p_TreeNode.Nodes)
            {
                _SubNode.Checked = p_SelectCheck;
                SetSubNodeCheck(_SubNode, p_SelectCheck);
            }

        }
        private void SetParentCheck(TreeNode p_TreeNode)
        {
            if (p_TreeNode.Checked && p_TreeNode.Parent != null)
            {
                p_TreeNode.Parent.Checked = true;
                SetParentCheck(p_TreeNode.Parent);
            }
        }
        private void SetParentNotCheck(TreeNode p_TreeNode)
        {
            if (!p_TreeNode.Checked && p_TreeNode.Parent != null)
            {
                foreach (TreeNode _Node in p_TreeNode.Parent.Nodes)
                {
                    if (_Node.Checked) return;
                }
                p_TreeNode.Parent.Checked = false;
                SetParentNotCheck(p_TreeNode.Parent);
            }
        }

然后在AfterCheck里面增加如下代码:

private void tvFunction_AfterCheck(object sender, TreeViewEventArgs e)
        {
            // 禁用TreeView视图重绘的功能。
            tvFunction.BeginUpdate();
            if (m_SetClick)
            {
                SetSubNodeCheck(e.Node, e.Node.Checked);
                SetParentCheck(e.Node);
                SetParentNotCheck(e.Node);
                m_SetClick = true;
            }
            // 启用TreeView视图重绘的功能。
            tvFunction.EndUpdate();
        }

关于第4个问题,我遇到的情况是这样的,在权限设置里面我想在窗体Load的时候将所有的菜单组以及对应的子菜单都加载到树上面来,当我点击不同的角色的时候自动显示对应的权限,比如,我点击Administrator”,则TreeView上面的所有菜单组以及子菜单全部都勾选上,如果我点击“普通用户”,则那些系统设置相关的内容都不勾选,这就是需求,下面我们来看看如何实现这个需求:
首先,我根据不同的角色返回了一张表或者是一个集合,当用户点击角色名称的时候就已经获取到了这个表或者集合,我们要做的就是匹配界面上面TreeView里面的所有节点和返回来的那一张Table或者集合,如果能够完全匹配,那么就将其Checked属性设置为True,否则不理它,这里用到了递归来遍历这棵树,递归代码如下:

/// <summary>
        /// 递归遍历TreeView,然后对比已有的数据和TreeView上面的节点数据,
        /// 如果匹配成功,则选中TreeView上面的相应节点。
        /// </summary>
        /// <param name="tn"></param>
        private void FindTreeView(TreeNode tn)
        {
            tn.Checked = false;
            string FunctionID_dt = string.Empty;
            string FunctionID_tv = string.Empty;
            for (int i = 0; i < dt_ExistsRole.Rows.Count; i++)
            {
                FunctionID_dt = dt_ExistsRole.Rows[i][1].ToString().Trim();
                FunctionID_tv = tn.Name.Trim();
                if (FunctionID_dt == FunctionID_tv)
                {
                    tn.Checked = true;
                }
            }
            foreach (TreeNode tnSub in tn.Nodes)
            {
                FindTreeView(tnSub);
            }
        }

在TreeView的AfterSelect事件里面调用它,一定要是AfterSelect里面,而不是Click里面:

private void tvUserGroup_AfterSelect(object sender, TreeViewEventArgs e)
        {
            //每次选择一个节点的时候都取到这个节点的名称,名称就是数据库里面的UserGroupID。
            dt_ExistsRole = new BLL.sys_SetRoleManager().GetExistsRole("1", tvUserGroup.SelectedNode.Name);

            foreach (TreeNode tn in tvFunction.Nodes)
            {
                FindTreeView(tn);
            }
        }

效果如下图所示:

相关文章
|
7月前
|
存储 JSON 数据格式
docker load 后镜像名称为空的问题解决
Docker在容器化应用程序时提供了强大的镜像管理功能,但也可能在某些操作中遇到如镜像名称为空的问题。通过理解问题的成因并采取适当的解决方案,如正确保存和加载镜像、手动修复标签等,可以有效避免和解决这一问题。通过本文提供的指导,您可以确保在使用Docker进行镜像操作时更为顺利,并提高容器管理的效率。
440 82
|
10月前
|
安全 物联网 网络安全
公网IP证书怎么申请?
在数字化时代,互联网通信的安全性日益重要。公网IP证书(IP SSL证书)通过加密技术保护数据传输,确保数据的保密性、完整性和身份验证。适用于物联网设备、API接口和远程服务器等场景,提升用户信任度和合规性。申请流程包括确认IP地址、选择服务商、生成CSR和私钥、提交申请并验证、接收安装证书及测试优化。
公网IP证书怎么申请?
|
存储 算法 API
Flink DataStream API 批处理能力演进之路
本文由阿里云 Flink 团队郭伟杰老师撰写,旨在向 Flink Batch 社区用户介绍 Flink DataStream API 批处理能力的演进之路。
783 2
Flink DataStream API 批处理能力演进之路
|
Java 存储 数据库
如何用JAVA基于时间戳回放历史数据?
如何用JAVA基于时间戳回放历史数据?
211 4
|
Linux 编译器 vr&ar
【Linux】静态库和动态库
本文详细介绍了Linux系统中静态库和动态库的概念、区别、制作与使用方法,包括它们在链接时的区别、加载机制以及优缺点。
198 0
|
Java API 开发工具
企业微信api,企业微信sdk接口java调用源码
企业微信api,企业微信sdk接口java调用源码
Mac下安装zookeeper
Mac下安装zookeeper
321 0
|
存储 Cloud Native 测试技术
多主架构:VLDB 技术论文《Taurus MM: bringing multi-master to the cloud》解读
本文分享自华为云社区《多主创新,让云数据库性能更卓越》,作者: GaussDB 数据库。 华为《Taurus MM: bringing multi-master to the cloud》论文被国际数据库顶会 VLDB 2023 录用,这篇论文里讲述了符合云原生数据库特点的超燃技术。介绍了如何通过各种黑科技减少云原生数据库的网络消耗,进而提升云原生数据库的性能和稳定性。下面就让我们抽丝剥茧,细细品味技术的魅力,揭开华为云数据库多主技术的面纱。 说明:技术论文中的 Taurus 在华为云商用的产品名是 GaussDB (for MySQL),是 GaussDB (for MySQL) 的云原
309 0
|
前端开发 JavaScript Java
前端LayUI框架快速上手实现登入注册
前端LayUI框架快速上手实现登入注册
372 0
Nuitka打包 制作安装包
扩展部分,将exe文件制作为安装包
315 0