C# TreeView组件TreeNode节点自动勾选解决方案(TreeViewNodeCheckHander)


  C# TreeView组件TreeNode节点自动勾选解决方案(TreeViewNodeCheckHander)

TreeView 节点自动勾选的场景:

1. 勾选/不勾选父级节点,要同步更新所有子节点的状态
2. 当勾选子节点,父节点必须勾选!
3. 当所有子节点全部勾选,父节点必须是勾选状态
4. 当所有子节点全部不勾选,父节点必须是不勾选状态



C# TreeView组件TreeNode节点自动勾选解决方案(TreeViewNodeCheckHander)



TreeViewNodeCheckHander类使用方法



C# Code:

private void frmSoftwareFunction_Load(object sender, EventArgs e)
{
  
  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




C/S框架网|原创精神.创造价值.打造精品

扫一扫加微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务



版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:C# 按住鼠标左键移动窗体Form的位置,C#拖动窗体通用类
下一篇:C# Winform 软件用户授权注册系统V2.1 测试程序(Tester.exe)
评论列表

发表评论

评论内容
昵称:
关联文章

C# TreeViewTreeNode节点自动解决方案(TreeViewNodeCheckHander)
C# Winform的CheckListBox控灰掉项目解决方案
解决表格记录复组件ColumnHeaderCheckBox排序出现混乱问题
解决方案:扩展按钮自定义权限没有出现在权限树给用户
C#.Net自定义控 - CheckedListBoxEditor(支持多值及新增)
C#.NET TreeView拖拽功能(Drag,Drop)
解决frmMain窗体的Dock根据NavBarControl自动同步缩放
C#通用窗体
C#.Net局域网版本自动升级解决方案(原创)
C#通用窗体 (源码)
【原创】C# Winform Dev自动下拉弹框筛选数据PopupContainerEdit
弹出窗体多条记录自动添加到明细表
C#.NET C/S结构版本自动升级解决方案2.0详解 (一)
整栏控制类 - ColumnCheckEdit(C#.Net)
系统管理->模块列表界面->可用列与不有什么作用?
C#.NET C/S结构版本自动升级解决方案之升级策略
使用递归获取TreeList中所有的结点
C# DataGridView自动添加弹出菜单(ContextMenuStrip)复制单元格的值
C#.NET C/S结构版本自动升级解决方案开发文档下载
C#.NET C/S结构版本自动升级解决方案之流程图