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属性问题的更多相关文章

  1. jQuery中判断input的checked属性

    <input type="checkbox" id="ipt1" checked> <input type="checkbox&qu ...

  2. 关于jQuery——attr方法和prop方法获取input的checked属性操作

    经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性,获取 ...

  3. jquery attr方法和prop方法获取input的checked属性问题

    jquery attr方法和prop方法获取input的checked属性问题   问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法 ...

  4. jquery attr方法获取input的checked属性问题

    1.通过prop方法获取checked属性,获取的checked返回值为boolean,选中为true,否则为flase <input type="checkbox" id= ...

  5. jquery attr()方法获取input的checked属性问题

    问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性 ...

  6. 关于使用jquery对input中type为radio的标签checked属性的增加与移除

    需求:对radio的checked属性先消除然后进行重新设置: 初步方案: $("auForm input :radio[value='0']").removeAttr('chec ...

  7. jQuery中attr()和prop()的区别,修改checked属性 jquery attr('checked' 不起作用 attr('checked' 不对

    在做复选框全选按钮的时候,出现了一个问题,使用语句$.attr('checked',true),将复选框的属性改为被选中,在chrome浏览器中第一次点击有效后面就不行了,IE8倒是没有问题. 百度了 ...

  8. 在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr。

    在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr. $("#checkAll").prop("checked", true ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件的checkable和checked属性

    checkable属性 checkable属性确认按钮是否可以被选中,缺省情况下该值为False,即按钮是不能被选中的. 可选择的按钮按下之后,按钮不会自动弹起来,此时按钮为选中状态,当再次点击按钮时 ...

随机推荐

  1. JavaScript中的事件委托机制跟深浅拷贝

    今天聊下JavaScript中的事件委托跟深浅拷贝 事件委托 首先呢,介绍一下事件绑定 //方法一:通过onclick <button onclick="clickEvent()&qu ...

  2. C# 关机/重启/注销计算机

    一.调用 shutdown.exe 执行操作 调用 shutdown.exe 执行计算机关机.重启.注销操作,还可以设置多长时间后执行操作,代码如下: 1 /// <summary> 2 ...

  3. C++ STL 栈和队列

    栈和队列 头文件 #include<queue> // 队列 #include<stack> //栈 定义方式 //参数就是数据类型 stack<int> s; q ...

  4. [Noip模拟题]Seq

    题目描述 由于hyf长得实在是太帅了,英俊潇洒,风流倜傥,人见人爱,花见花开,车见车载.有一群MM排队看hyf.每个MM都有自己独特的风格,由于hyf有着一颗包容的心,所以,什么风格的MM他都喜欢-- ...

  5. FLask之视图

    视图 1 FBV def index(): return render_template('index.html') app.add_url_rule('/index', 'index', index ...

  6. 六个你不知道的PR快捷键,拯救你的剪辑效率

    5G时代到来,会剪辑视频的人,无论在校园还是未来步入职场都很吃香.对于普通人来说,视频处理也成为了一个通用技能.PR是我们大多数人剪辑中,经常会用到的剪辑工具,之前的文章中已经给大家总结了pr的一些提 ...

  7. JavaScript中函数的调用!

    JavaScript中函数的调用! 1 普通函数 // 1 普通函数 function fn() { console.log(123); } // 函数名 + 一个小括号! 或者 函数名.call() ...

  8. 自导自演的面试现场,趣学MySQL的10种文件

    导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇. 今天我要跟你分享的MySQL话题是:"自导自演的数据库面试现场--谈谈MySQL的10种文件" 换一种写作风格 ...

  9. 干货 | 质量保障新手段,携程回归测试平台实践 原创 Sedro 携程技术 2021-01-21

    干货 | 质量保障新手段,携程回归测试平台实践 原创 Sedro 携程技术 2021-01-21

  10. Win+R 快速启动程序

    将某个程序的可执行C:\Program Files\Oracle\VirtualBox\VirtualBox.exe 或其快捷键 放入 某个自建的快捷键集合文件夹,可以自定义命名 如 vb 将其添加到 ...