C# TreeView组件TreeNode节点自动勾选解决方案(TreeViewNodeCheckHander)
C# TreeView组件TreeNode节点自动勾选解决方案(TreeViewNodeCheckHander)TreeView 节点自动勾选的场景:
1. 勾选/不勾选父级节点,要同步更新所有子节点的状态
2. 当勾选子节点,父节点必须勾选!
3. 当所有子节点全部勾选,父节点必须是勾选状态
4. 当所有子节点全部不勾选,父节点必须是不勾选状态

TreeViewNodeCheckHander类使用方法:
C# Code:
private void frmSoftwareFunction_Load(object sender, EventArgs e)
{
tv.Nodes.Clear();
TreeViewNodeCheckHander.Handle(tv);
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
{
tv.Nodes.Clear();
TreeViewNodeCheckHander.Handle(tv);
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
TreeViewNodeCheckHander类:
C# Code:
/// <summary>
/// TreeView组件TreeNode节点自动勾选几种场景及解决方案
/// </summary>
public class TreeViewNodeCheckHander
{
public static void Handle(TreeView tv)
{
tv.AfterCheck += OnTreeView_AfterCheck;
}
private static void OnTreeView_AfterCheck(object sender, TreeViewEventArgs e)
{
//若当前节点包含子节点,勾选或不勾选全部子节点
if (e.Node.Nodes.Count > 0)
{
SetCheck(e.Node.Nodes, e.Node.Checked);
return;
}
//当前节点已勾选,父级节点也要勾选
if (e.Node.Checked && e.Node.Parent != null && e.Node.Parent.Checked == false)
{
SetCheck(e.Node.Parent, true);
return;
}
//若当前节点所有同级节点没有勾选,父级节点要取消勾选
if (e.Node.Parent != null && e.Node.Parent.Checked)
{
if (IsNoCheckedAll(e.Node.Parent.Nodes))
SetCheck(e.Node.Parent, false);
return;
}
}
private static void SetCheck(TreeNodeCollection nodes, bool value)
{
if (nodes.Count == 0) return;
TreeView tv = nodes[0].TreeView;
try
{
tv.AfterCheck -= OnTreeView_AfterCheck;
foreach (TreeNode node in nodes) node.Checked = value;
}
finally
{
tv.AfterCheck += OnTreeView_AfterCheck;
}
}
private static void SetCheck(TreeNode node, bool value)
{
try
{
node.TreeView.AfterCheck -= OnTreeView_AfterCheck;
node.Checked = value;
}
finally
{
node.TreeView.AfterCheck += OnTreeView_AfterCheck;
}
}
/// <summary>
/// 是否全部勾选
/// </summary>
/// <param name="nodes"></param>
/// <returns></returns>
public static bool IsCheckedAll(TreeNodeCollection nodes)
{
int count = 0;
foreach (TreeNode N in nodes) if (N.Checked) count++;
return count == nodes.Count;
}
/// <summary>
/// 是否全部没有勾选
/// </summary>
/// <param name="nodes"></param>
/// <returns></returns>
public static bool IsNoCheckedAll(TreeNodeCollection nodes)
{
int count = 0;
foreach (TreeNode N in nodes) if (N.Checked == false) count++;
return count == nodes.Count;
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
/// <summary>
/// TreeView组件TreeNode节点自动勾选几种场景及解决方案
/// </summary>
public class TreeViewNodeCheckHander
{
public static void Handle(TreeView tv)
{
tv.AfterCheck += OnTreeView_AfterCheck;
}
private static void OnTreeView_AfterCheck(object sender, TreeViewEventArgs e)
{
//若当前节点包含子节点,勾选或不勾选全部子节点
if (e.Node.Nodes.Count > 0)
{
SetCheck(e.Node.Nodes, e.Node.Checked);
return;
}
//当前节点已勾选,父级节点也要勾选
if (e.Node.Checked && e.Node.Parent != null && e.Node.Parent.Checked == false)
{
SetCheck(e.Node.Parent, true);
return;
}
//若当前节点所有同级节点没有勾选,父级节点要取消勾选
if (e.Node.Parent != null && e.Node.Parent.Checked)
{
if (IsNoCheckedAll(e.Node.Parent.Nodes))
SetCheck(e.Node.Parent, false);
return;
}
}
private static void SetCheck(TreeNodeCollection nodes, bool value)
{
if (nodes.Count == 0) return;
TreeView tv = nodes[0].TreeView;
try
{
tv.AfterCheck -= OnTreeView_AfterCheck;
foreach (TreeNode node in nodes) node.Checked = value;
}
finally
{
tv.AfterCheck += OnTreeView_AfterCheck;
}
}
private static void SetCheck(TreeNode node, bool value)
{
try
{
node.TreeView.AfterCheck -= OnTreeView_AfterCheck;
node.Checked = value;
}
finally
{
node.TreeView.AfterCheck += OnTreeView_AfterCheck;
}
}
/// <summary>
/// 是否全部勾选
/// </summary>
/// <param name="nodes"></param>
/// <returns></returns>
public static bool IsCheckedAll(TreeNodeCollection nodes)
{
int count = 0;
foreach (TreeNode N in nodes) if (N.Checked) count++;
return count == nodes.Count;
}
/// <summary>
/// 是否全部没有勾选
/// </summary>
/// <param name="nodes"></param>
/// <returns></returns>
public static bool IsNoCheckedAll(TreeNodeCollection nodes)
{
int count = 0;
foreach (TreeNode N in nodes) if (N.Checked == false) count++;
return count == nodes.Count;
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761

参考文档:
主窗体NavBar组件设置大小图标与模块对应
C# Mini版本文件浏览器.TreeView/ListView应用
C#.NET TreeView拖拽功能(Drag,Drop)
ToolTipController超提示组件显示超提示信息在指定位置|C/S开发框架
CSFramework.EF.PostgreSql数据库组件 PostgreSql数据库测试报告|C/S开发框架
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)|C/S开发框架
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)
DevExpress组件版本下载、安装与VS开发环境 | Winform C/S框架|C/S开发框架
VS2022 .NET7手动更改组件类型(TextEdit改为ComboBoxEdit)|C/S开发框架
C/S结构快速开发框架使用的DevExpress常用组件|C/S开发框架
使用System.Data.OracleClient组件搭建Oracle数据库连接获取DataTable|C/S开发框架
C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架
VS2022解决方案部署DevExpress组件(DevExpress Project Settings)|C/S开发框架
C# DevExpress教学 GridLookUpEdit组件表格下拉组件使用|C/S开发框架
DevExpress常用组件操作扩展类:DevExpressExtensions.cs|C/S开发框架
主窗体NavBar组件设置大小图标与模块对应
C# Mini版本文件浏览器.TreeView/ListView应用
C#.NET TreeView拖拽功能(Drag,Drop)
ToolTipController超提示组件显示超提示信息在指定位置|C/S开发框架
CSFramework.EF.PostgreSql数据库组件 PostgreSql数据库测试报告|C/S开发框架
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)|C/S开发框架
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)
DevExpress组件版本下载、安装与VS开发环境 | Winform C/S框架|C/S开发框架
VS2022 .NET7手动更改组件类型(TextEdit改为ComboBoxEdit)|C/S开发框架
C/S结构快速开发框架使用的DevExpress常用组件|C/S开发框架
使用System.Data.OracleClient组件搭建Oracle数据库连接获取DataTable|C/S开发框架
C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架
VS2022解决方案部署DevExpress组件(DevExpress Project Settings)|C/S开发框架
C# DevExpress教学 GridLookUpEdit组件表格下拉组件使用|C/S开发框架
DevExpress常用组件操作扩展类:DevExpressExtensions.cs|C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
