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的取值没有影响。
最新文章
- 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司
- python 引用传递与值传递
- 【HDU2896】病毒侵袭 AC自动机
- workerman centos 7 开机自动启动
- GMap.Net开发之技巧小结
- MySQL 5.7贴心参数之binlog_row_image
- NBIbatis 微信框架
- HTTP访问的两种方式(HttpClient+HttpURLConnection)整合汇总对比
- HTML笔记(一)
- Format a Hard Drive in Csharp C#格式化总结
- hdu 1195 Open the Lock(广搜,简单)
- OBIEE接受外部参数
- Windows 小端存储
- MySQL一些中重要命令
- Gym 101873K - You Are Fired - [贪心水题]
- 一篇文章让你学透Linux系统中的more命令
- qrcodenet二维码图片下扩展区域添加号段的操作
- APT攻击基础科普
- Leetcode 98 验证二叉搜索树 Python实现
- 微信小程序 - 五星评分(含半分)