private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
var node = e.Node;
if (node == null) return;
//根据父节点状态,全选或全消子节点
node.StateImageIndex = node.StateImageIndex == ? : ;
UpdateSubNodeCheckStatus(node); //确定子节点的父节点是否被选中(所有子节点选中时,父节点才选中)
UpdateParentNodeCheckStatus(node); //根节点级别选择互斥
if (node.StateImageIndex != ) return;
var rootNode = GetRootByNode(node);
UncheckNextNode(rootNode);
UncheckPrevNode(rootNode);
}
private static TreeNode GetRootByNode(TreeNode node)
{
while (true)
{
if (node.Level == )
{
return node;
}
var parentNode = node.Parent;
node = parentNode;
}
} private void UncheckPrevNode(TreeNode node)
{
if (node.PrevNode == null) return;
node.PrevNode.StateImageIndex = ;
UpdateSubNodeCheckStatus(node.PrevNode);
UncheckPrevNode(node.PrevNode);
} private void UncheckNextNode(TreeNode node)
{
while (true)
{
if (node.NextNode == null) return;
//node.NextNode.Checked = false;
node.NextNode.StateImageIndex = ;
UpdateSubNodeCheckStatus(node.NextNode);
node = node.NextNode; }
} private static void UpdateParentNodeCheckStatus(TreeNode node)
{
var parentNode = node.Parent;
if (parentNode == null) return; if (IsSubNodeAllCheck(parentNode))
{
parentNode.StateImageIndex = ;
}
else if (IsSubNodeAllUncheck(parentNode))
{
parentNode.StateImageIndex = ;
}
else
{
parentNode.StateImageIndex = ;
} UpdateParentNodeCheckStatus(parentNode);
} private void UpdateSubNodeCheckStatus(TreeNode parentNode)
{
var node = parentNode;
foreach (TreeNode subNode in node.Nodes)
{
subNode.StateImageIndex = node.StateImageIndex;
UpdateSubNodeCheckStatus(subNode);
}
} //判断节点的子节点是否全选
private static bool IsSubNodeAllCheck(TreeNode parentNode)
{
return parentNode.Nodes.Cast<TreeNode>().All(subNode => subNode.StateImageIndex==);
} //判断同级的节点是否全不选
private static bool IsSubNodeAllUncheck(TreeNode parentNode)
{
return parentNode.Nodes.Cast<TreeNode>().All(subNode => subNode.StateImageIndex==);
}

WinForm TreeView 三种状态的更多相关文章

  1. TreeView 三种状态 没多大变化 只是增加了很多函数以方便调用

    using System.Drawing; using System.Windows.Forms; using System.ComponentModel; namespace SimpleCusto ...

  2. TreeView的三种状态,全选,全不选,半选中

    我知道的设置treeview节点的三种状态,如果不是买的控件,那么通过代码,只能设置两种状态,我知道的有三种方法, 第一种是重写treeview,第二种是把三种状态做成小图标,让节点复选框随着不同的状 ...

  3. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  4. hibernate三种状态

    转自:http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 学过hibernate的人都可能都知道hibernate有三种状态,transien ...

  5. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

  6. hibernate学习笔记之三 持久化的三种状态

    Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状 ...

  7. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  8. Hibernate延迟加载、三种状态、脏检查 缓存

    一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...

  9. 【Java EE 学习 45】【Hibernate学习第二天】【对象的三种状态】【一对多关系的操作】

    一.对象的三种状态. 1.对象有三种状态:持久化状态.临时状态.脱管状态(游离状态) 2.Session的特定方法能使得一个对象从一个状态转换到另外一个状态. 3.三种状态的说明 (1)临时状态:临时 ...

随机推荐

  1. 【三支火把】---队列和栈的C程序实现

    这几天总结了C语言的队列,栈的实现方法,在此总结一下:一.栈 首先从栈开始,诚然,相信学习过数据结构的你,肯定应该知道栈是什么东西了,如果不知道也没事每一句话我就可以帮你总结--数据只在栈顶进行插入和 ...

  2. php错误级别

    E_ERROR 致命的运行错误.错误无法恢复,暂停执行脚本. E_WARNING 运行时警告(非致命性错误).非致命的运行错误,脚本执行不会停止. E_PARSE 编译时解析错误.解析错误只由分析器产 ...

  3. iOS 状态栏、导航栏、工具栏、选项卡大小

    1.状态栏状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半透明的黑 ...

  4. \\ip 映射 指定的网络名不再可用

    问题:\\ip 映射  指定的网络名不再可用 解决方法:服务器端打开服务列表  services.msc 启动两个进程 1.Computer Browser 2. Workstation 就正常了~~ ...

  5. MySQL主主复制+LVS+Keepalived实现MySQL高可用性

    http://bestvivi.com/2015/09/09/MySQL%E4%B8%BB%E4%B8%BB%E5%A4%8D%E5%88%B6+LVS+Keepalived%E5%AE%9E%E7% ...

  6. 在含有null值的复杂类的集合(Collection)中取最大值

    在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较.取最大值或最小值. 举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素: public class Clas ...

  7. Leetcode Python Solution(continue update)

    leetcode python solution 1. two sum (easy) Given an array of integers, return indices of the two num ...

  8. Linux下pcapy的安装问题

    在安装pcapy包的时候 cd pcapy-0.10.8/ python setup.py install 报错 error trying to exec ‘cc1plus’: execvp: No ...

  9. OpenSSH Client信息泄露和缓冲区溢出漏洞

    一.风险简述: 2016年1月14日OpenSSH发布官方公告称,OpenSSH Client 5.4~7.1版本中未公开说明的功能(Roaming)存在信息泄漏和缓冲区溢出漏洞,此漏洞可能导致您通过 ...

  10. print之模块化

    这里参考特权同学的模块化思想,将常用的print等任务模块化,便于直接调用,提高代码的效率和易读性.现转载之,以供日后的学习和工作参考. print模块参考代码如下: //============== ...