c# TreeView实现三种选中状态
时间:2019-09-17
本文章向大家介绍c# TreeView实现三种选中状态,主要包括c# TreeView实现三种选中状态使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
c# 项目中需要实现树状选项的勾选,有全选,半勾选,不选的状态。
因原控件中只有勾选和不勾选两种状态,所以半勾选状态需要使用代码绘制和自行定义。
勾选:Node.Checked=true
不勾选: Node.Checked=false
半勾选: Node.Checked=false && Node.ToolTipText="部分勾选"
注意:半勾选状态需要重新绘制控件需要设置控件属性DrawMode为OwnerDrawText或者OwnerDrawAll
核心逻辑一:设置父亲节点的选中状态(选中一个节点时,判断兄弟节点是否全选;取消一个节点时,需要判断兄弟节点是否有选中状态和半选中状态。由此来判断父节点的选中状态)
//取消节点选中状态之后,取消所有父节点的选中状态 private void setParentNodeCheckedState(TreeNode currNode, bool state) { TreeNode parentNode = currNode.Parent; //获得当前节点的父节点 parentNode.Checked = state; //设置父节点的选中状态 if (state == false) //当状态设置为false { int flag = 0; foreach (TreeNode broNode in parentNode.Nodes) //判断该父节点的子节点中,是否有半勾选状态的选项 { if (broNode.Checked||broNode.ToolTipText.Equals("部分勾选")) { flag = 1; } } if (flag == 1) // 有设置父节点为半勾选状态 { parentNode.ToolTipText = "部分勾选"; parentNode.Checked = false; } else { //设置父节点状态为 未勾选 parentNode.ToolTipText = ""; parentNode.Checked = true; parentNode.Checked = false; //需要改变节点的Checked状态,才能重新绘制控件; } } else { //当父节点设置为选中状态时 int flag = 0; foreach (TreeNode broNode in parentNode.Nodes)//判断该父节点的子节点下是否有未选中的节点。 { if (!broNode.Checked) { flag = 1; } } if (flag == 1) { parentNode.ToolTipText = "部分勾选"; parentNode.Checked = false; } else { parentNode.ToolTipText = ""; parentNode.Checked = true; } } if (currNode.Parent.Parent != null) //如果父节点之上还有父节点 { setParentNodeCheckedState(currNode.Parent, state); //递归调用 } }
核心逻辑二:设置子节点的选中状态
//选中节点之后,选中节点的所有子节点 private void setChildNodeCheckedState(TreeNode currNode, bool state) { TreeNodeCollection nodes = currNode.Nodes; //获取所有子节点 if (nodes.Count > 0) //存在子节点 foreach (TreeNode tn in nodes) { tn.Checked = state; tn.ToolTipText = ""; setChildNodeCheckedState(tn, state);//递归调用子节点的子节点 } }
设置控件监听属性AfterCheck
private void skinTreeView1_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action == TreeViewAction.ByMouse) //鼠标点击 { //textBox1.Text = e.Node.Text; if (e.Node.Checked) //选中 { e.Node.ToolTipText = ""; //选中节点之后,选中节点的所有子节点 setChildNodeCheckedState(e.Node, true); if (e.Node.Parent != null) { setParentNodeCheckedState(e.Node, true); } } else //取消选中 { e.Node.ToolTipText = ""; //取消节点选中状态之后,取消所有子节点的选中状态 setChildNodeCheckedState(e.Node, false); //如果节点存在父节点,取消父节点的选中状态 if (e.Node.Parent != null) { setParentNodeCheckedState(e.Node, false); } } } }
设置重新绘制监听DrawNode,为半勾选状态绘制新图案
private void ClassTreeList_DrawNode(object sender, DrawTreeNodeEventArgs e) { if (e.Bounds.Location.X <= 0) { return; } var treeview = sender as TreeView; var brush = Brushes.Black; //黑色 if (e.Node.ToolTipText.EndsWith("部分勾选")&&e.Node.Checked==false) { //判断为半勾选状态 var location = e.Node.Bounds.Location; location.Offset(-10, 7); var size = new Size(7, 7); e.Graphics.FillRectangle(brush, new Rectangle(location, size)); //这里绘制的是正方形 } //绘制文本 e.Graphics.DrawString(e.Node.Text, treeview.Font, brush, e.Bounds.Left, e.Bounds.Top); }
原文地址:https://www.cnblogs.com/yhood/p/11532787.html
- Pytorch 0.3发布:实现多方面提速,增加对ONNX支持 | 快讯
- 基于DB time的调优分析 (r6笔记第79天)
- 通过shell脚本抓取awr报告中的问题sql(r6笔记第78天)
- Tomcat 快速入门
- 服务器进程异常的原因分析(r6笔记第74天)
- Elastic 技术栈之 Filebeat
- Elastic 技术栈之 Logstash 基础
- 备库CPU使用异常优化(r6笔记第73天)
- 数据清理的遗留问题处理(二)(r6笔记第91天)
- Kaggle Titanic 生存预测比赛超完整笔记(上)
- 多系统交互中DBA需要实现的技术细节(r6笔记第90天)
- Kaggle Titanic 生存预测比赛超完整笔记(中)
- SDP(11):MongoDB-Engine功能实现
- SDP(10):文本式大数据运算环境-MongoDB-Engine功能设计
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法