VS中使用TreeView的Checked属性问题
VS中使用TreeView,当需要用到Checked属性,并需要同步子节点和父节点的Checked属性时,若使用AfterCheck事件会导致死循环,这里我使用的是NodeMouseClick事件。代码如下:
private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Node == null)
return;
switch (e.Button)
{
case MouseButtons.Left: //左键
//改变子节点的状态
this.CheckChildNode(e.Node);
//改变父节点的状态
this.CheckParentNode(e.Node);
break;
default:
break;
}
} private void CheckChildNode(TreeNode node)
{
if (node.Nodes.Count < 1)
{
return;
}
foreach (TreeNode childNode in node.Nodes)
{
if (childNode.Checked != node.Checked)
{
childNode.Checked = node.Checked;
CheckChildNode(childNode);
}
}
} private void CheckParentNode(TreeNode node)
{
if (node.Parent == null)
{
return;
}
TreeNode parentNode = node.Parent;
for (int i = 0; i < parentNode.Nodes.Count; i++)
{
if (!parentNode.Nodes[i].Checked)
{
parentNode.Checked = false;
CheckParentNode(parentNode);
return;
}
}
parentNode.Checked = true;
CheckParentNode(parentNode);
}
但是,在如下图的情况下:若单击“节点1”的非Checkbox位置(即只是单击节点,并不改变Checked属性),会导致子节点的Checked属性全部被置为false。

因为,在单击节点的时候,触发了NodeMouseClick事件,而此时无法判断是否是在改变其Checked属性。笔者尝试在NodeMouseClick和AfterCheck事件中记录并判断当前是否是在改变点击节点的Checked属性,结果由于无法确定点击时先触发的是哪个事件,导致这个方法失败了。
最后,笔者通过判断点击的位置来确定是否是在改变点击节点的Checked属性,解决了这一缺陷。修改后的代码如下:
/// <summary>
/// 0级树节点Checkbox有效范围的X的最小值
/// </summary>
private int TreeNodeZeroLevelCheckboxLocationXMin = 3;
/// <summary>
/// 0级树节点Checkbox有效范围的X的最大值
/// </summary>
private int TreeNodeZeroLevelCheckboxLocationXMax = 15;
/// <summary>
/// 相邻等级树节点Checkbox有效范围的X的差值
/// </summary>
private int TreeNodeNextLevelCheckboxDiffX = 0;
private void Form1_Load(object sender, EventArgs e)
{
TreeNodeNextLevelCheckboxDiffX = this.treeView.Indent;
TreeNodeZeroLevelCheckboxLocationXMin += TreeNodeNextLevelCheckboxDiffX;
TreeNodeZeroLevelCheckboxLocationXMax += TreeNodeNextLevelCheckboxDiffX;
}
private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Node == null)
return;
switch (e.Button)
{
case MouseButtons.Left: //左键
//判断点击位置是否为Checkbox的有效范围
if (e.X <= TreeNodeZeroLevelCheckboxLocationXMax + e.Node.Level * TreeNodeNextLevelCheckboxDiffX
&& e.X >= TreeNodeZeroLevelCheckboxLocationXMin + e.Node.Level * TreeNodeNextLevelCheckboxDiffX)
{
//改变子节点的状态
this.CheckChildNode(e.Node);
//改变父节点的状态
this.CheckParentNode(e.Node);
}
break;
default:
break;
}
}
代码中的三个常量是笔者测试出来的,其中this.treeView.Indent是指每个子树节点级别的缩进距离。测试发现只要在X的范围内点击节点就会改变Checked属性,Y的取值没有影响。
VS中使用TreeView的Checked属性问题的更多相关文章
- jQuery中判断input的checked属性
<input type="checkbox" id="ipt1" checked> <input type="checkbox&qu ...
- 关于jQuery——attr方法和prop方法获取input的checked属性操作
经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性,获取 ...
- jquery attr方法和prop方法获取input的checked属性问题
jquery attr方法和prop方法获取input的checked属性问题 问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法 ...
- jquery attr方法获取input的checked属性问题
1.通过prop方法获取checked属性,获取的checked返回值为boolean,选中为true,否则为flase <input type="checkbox" id= ...
- jquery attr()方法获取input的checked属性问题
问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性 ...
- 关于使用jquery对input中type为radio的标签checked属性的增加与移除
需求:对radio的checked属性先消除然后进行重新设置: 初步方案: $("auForm input :radio[value='0']").removeAttr('chec ...
- jQuery中attr()和prop()的区别,修改checked属性 jquery attr('checked' 不起作用 attr('checked' 不对
在做复选框全选按钮的时候,出现了一个问题,使用语句$.attr('checked',true),将复选框的属性改为被选中,在chrome浏览器中第一次点击有效后面就不行了,IE8倒是没有问题. 百度了 ...
- 在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr。
在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr. $("#checkAll").prop("checked", true ...
- PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件的checkable和checked属性
checkable属性 checkable属性确认按钮是否可以被选中,缺省情况下该值为False,即按钮是不能被选中的. 可选择的按钮按下之后,按钮不会自动弹起来,此时按钮为选中状态,当再次点击按钮时 ...
随机推荐
- CTFshow-萌新赛逆向_flag白给
查看题目信息 下载后得到一个flag.exe文件,进行测试 使用PEiD查壳 发现一个upx的壳 使用命令进行解壳 upx -d 拿到一个无壳的程序 放进OD打开,查找关键词 发现信息 成功拿到序列号 ...
- Android之旅2
一.动静态调试四大组件 (一).activity 一个又一个的界面,需要在manifest里面注册 (二). (三).service (四).broadcast receiver 二.开始分析 1.先 ...
- 5.2 Spring5源码--Spring AOP源码分析二
目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...
- Android 代码规范大全
前言 虽然我们项目的代码时间并不长,也没经过太多人手,但代码的规范性依然堪忧,目前存在较多的比较自由的「代码规范」,这非常不利于项目的维护,代码可读性也不够高, 此外,客户端和后端的研发模式也完全不同 ...
- 对 js加密数据进行爬取和解密
对 js加密数据进行爬取和解密 分析: 爬取的数据是动态加载 并且我们进行了抓包工具的全局搜索,没有查找到结果 意味着:爬取的数据从服务端请求到的是加密的密文数据 页面每10s刷新一次,刷新后发现数据 ...
- c#使用谷歌身份验证GoogleAuthenticator
此功能相当于给系统加了个令牌,只有输入对的一组数字才可以验证成功.类似于QQ令牌一样. 一丶创建最核心的一个类GoogleAuthenticator 此类包含了生成密钥,验证,将绑定密钥转为二维码. ...
- gRPC设计动机和原则
https://mp.weixin.qq.com/s/NMIIa0W722zo_AxCqASc0g TiDB 与 gRPC 的那点事儿 黄东旭 PingCAP 2017-08-10 gRPC 背景 ...
- celery 原理
https://mp.weixin.qq.com/s/FzvZHQpF5mhV9t_HBzlcwg Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处 ...
- Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
Optimistic concurrency control https://en.wikipedia.org/wiki/Optimistic_concurrency_control Optimist ...
- Spring常见问题总结
1. 什么是 Spring 框架? Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性.Spring 官网:https://spring.io/. 我们一般说 Sprin ...