开发者社区> allen_chen_0118> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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);
            }
        }

效果如下图所示:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
autojs-webview上传文件
牙叔教程 简单易懂
53 0
treeview
2017年9月14日 13:31:30 星期四 两个基于jquery的树 http://jquery-plugins.net/tag/treeview http://longmatthewh.github.
967 0
Winform TreeView 查找下一个节点
转载:http://www.cnblogs.com/Ruiky/archive/2013/02/01/2888674.html public static class TreeViewHelper { private static IEnumerable child...
778 0
Winform调用系统的剪切,复制,粘贴文件功能
     // /// 复制或剪切文件至剪贴板(方法) /// /// 需要添加到剪切板的文件路径数组 /// 是否剪切true为剪切,false为复制 public static void Co...
915 0
C# winform对话框用法大全收藏
  对话框中我们常用了以下几种: 1、文件对话框(FileDialog) 它又常用到两个:    打开文件对话框(OpenFileDialog)    保存文件对话(SaveFileDialog) 2、字体对话框(FontDialog) 3、颜色对话框(ColorDialog) 4、打印预浏对话框(PrintPreviewDialog) 5、页面设置(PrintDialog) 6、打印对话框(PrintDialog)   还有更多,有时间的网友可以看看MSDN。
1308 0
(转)从PC的总线到ARM内部总线
我在学习《Linux设备驱动程序(第3版)》的 第九章 与硬件通信 时,对 I\O总线的概念 不是很清晰,所以查找了有关资料。现在总结如下: 本文的参考资料:1、 《AMBA、AHB、APB总线简介》 作者 adamzhao 日期 2006-11-16 19:33:00转载网址:http://www.
1001 0
RichView 12.04 破解版
RichView 12.04 破解版 配套RichViewActions ScaleRichView RVControls全   下载: http://download.
771 0
c# WinForm 中 treeview实现整行选择
设置TreeView.FullRowSelect 属性为true。如果选择突出显示跨越树视图控件的整个宽度,则为 true;否则为 false。默认为 false。 注意: 当 FullRowSelect 为 true 时,选择突出显示将跨越树视图的整个宽度,即整个显示区域的宽度而不仅仅是树节点标签的宽度。
977 0
+关注
allen_chen_0118
开源技术专家
118
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载