WinForm中TreeView自定义勾选规则
1.说明
下面介绍WinForm中两种常用TreeView自定义勾选规则,需要使用AfterCheck控件事件递归实现。
第一种能实现:1.勾选(取消)父节点,全部子节点自动勾选(取消);2.全部子节点勾选(取消),父节点自动勾选(取消)。
第二种能实现:1.只要子节点选中,上一级父节点自动选中;2.要求一个完整路径父节点与子节点不能间隔中断;3.要求一个完整路径子节点唯一
2.勾选规则一
事件解读:当产生勾选事件分别判断自身节点判断和父节点是否存在,当自身节点勾选,子节点如果有未勾选,则子节点设置为勾选,自身未勾选则跳出判断;当父节点存在,判断子节点是否勾选,如果全部子节点勾选,则父节点勾选。这样只要发生一个勾选事件,每个节点向上和向下都进行判断,就能完成所有节点的判定,并完成相应勾选。
private void tv1_AfterCheck(object sender, TreeViewEventArgs e)
{
try
{
if (e.Node.Nodes.Count > 0)
{
bool NoFalse = true;
foreach (TreeNode tn in e.Node.Nodes)
{
if (tn.Checked == false)
{
NoFalse = false;
}
}
if (e.Node.Checked == true || NoFalse)
{
foreach (TreeNode tn in e.Node.Nodes)
{
if (tn.Checked != e.Node.Checked)
{
tn.Checked = e.Node.Checked;
}
}
}
}
if (e.Node.Parent != null && e.Node.Parent is TreeNode)
{
bool ParentNode = true;
foreach (TreeNode tn in e.Node.Parent.Nodes)
{
if (tn.Checked == false)
{
ParentNode = false;
}
}
if (e.Node.Parent.Checked != ParentNode && (e.Node.Checked == false || e.Node.Checked == true && e.Node.Parent.Checked == false))
{
e.Node.Parent.Checked = ParentNode;
}
}
}
catch (Exception ex)
{
}
}
3.勾选规则二
事件解读:当产生勾选事件分别判断子节点勾选和父节点是否存在,当子节点存在且勾选,计数加1,再判断自身节点是否勾选,自身节点未勾选则TreeView节点清空报障,整个路径都勾选情况下,自身节点的后面同级节点,如果有勾选,TreeView节点清空报障;当父节点存在,判断子节点是否勾选,只要子节点勾选,则父节点勾选。这样只要发生一个勾选事件,判断是否出现连续路径中断或同级节点是否多勾选,排除情况后保证节点向上的父节点都有勾选。
private void tv2_AfterCheck(object sender, TreeViewEventArgs e)
{
try
{
if (e.Node.Nodes.Count > 0)
{
int a = 0;
foreach (TreeNode tn in e.Node.Nodes)
{
if (tn.Checked == true)
{
a += 1;
//路径选择不连续,清除节点
if (e.Node.Checked == false)
{
tv2.Nodes.Clear();
MessageBox.Show("路径选择错误,路径不连续);
}
}
}
//路径选择不唯一,清除节点
if (a > 1)
{
tv2.Nodes.Clear();
MessageBox.Show("路径选择错误,勾选路径不唯一");
}
}
if (e.Node.Parent != null && e.Node.Parent is TreeNode)
{
foreach (TreeNode tn in e.Node.Parent.Nodes)
{
if (tn.Checked == true)
{
e.Node.Parent.Checked = true;
}
}
}
}
catch (Exception ex)
{
}
}
参考
以上为个人整理总结的知识,如有遗漏或错误欢迎留言指出、点评,如要引用,请写引用说明,谢谢。
[1]: https://blog.csdn.net/esunshine1985/article/details/49508989