同步TreeView中父结点和子结点的状态[以及Treeview的bug]
此代码仅仅是二级结点,即父结点下面只有一层子结点,只有两层结构
/// <summary>
/// 某个结点的CheckBox被选中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeViewDevices_AfterCheck(object sender, TreeViewEventArgs e)
{
//将父结点的状态同步给子结点
setChildNodeCheckedState(e.Node,e.Node.Checked); if (e.Node.Parent != null)
{
setParentNodeCheckedState(e.Node);
} } /// <summary>
/// 选中结点之后,自动选择当前结点所有的子结点
/// </summary>
/// <param name="currNode">当前结点</param>
/// <param name="state">选中状态</param>
private void setChildNodeCheckedState(TreeNode currNode, bool state)
{
TreeNodeCollection nodes = currNode.Nodes;
foreach (TreeNode tn in nodes)
{
tn.Checked = state;
setChildNodeCheckedState(tn, state);
}
} /// <summary>
/// 选中当前结点之后,设置父结点的状态
/// </summary>
/// <param name="currNode"></param>
private void setParentNodeCheckedState(TreeNode currNode)
{
if (currNode.Checked)//当前结点为选中状态
{
if (currNode.Parent.Checked==false)
{
treeViewDevices.AfterCheck -= new System.Windows.Forms.TreeViewEventHandler(this.treeViewDevices_AfterCheck);
currNode.Parent.Checked = true;//选中父结点的时候,会触发选中事件,导致又重复选中子结点,所以要先注销选中事件,然后再注册
treeViewDevices.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeViewDevices_AfterCheck);
}
}
else//当前结点未选中
{
bool flag = false;
TreeNodeCollection parentNodes = currNode.Parent.Nodes;
foreach (TreeNode treenode in parentNodes)
{
if (treenode.Checked)
{
flag = true;
break;
}
}
if (flag)//说明父结点的状态应该为选中状态
{
if (currNode.Parent.Checked == false)
{
treeViewDevices.AfterCheck -= new System.Windows.Forms.TreeViewEventHandler(this.treeViewDevices_AfterCheck);
currNode.Parent.Checked = true;//选中父结点的时候,会触发选中事件,导致又重复选中子结点,所以要先注销选中事件,然后再注册
treeViewDevices.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeViewDevices_AfterCheck);
}
}
else//无需选中父结点
{
if (currNode.Parent.Checked == true)
{
currNode.Parent.Checked = false;
}
}
}
}
TreeView的bug在这里有解决方法
http://social.msdn.microsoft.com/Forums/windows/en-US/9d717ce0-ec6b-4758-a357-6bb55591f956/possible-bug-in-net-treeview-treenode-checked-state-inconsistent?forum=winforms
同步TreeView中父结点和子结点的状态[以及Treeview的bug]的更多相关文章
- artdialog4.1.7 中父页面给子页面传值
artdialog4.1.7中父页面给子页面传值时看了一些网友的解决方法: 在父页面声明全局变量 var returnValue=“ ”,子页面用art.dialog.opener.returnVal ...
- React中父组件与子组件之间的数据传递和标准化的思考
React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...
- Vue中父组件向子组件传值
Vue中父组件向子组件传值 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- 关于css中父元素与子元素之间margin-top的问题
之前在使用经常遇到下面的问题: html: <div class="top"> <div class="one">I'm the fir ...
- angular中父组件给子组件传值-@input
1. 父组件调用子组件的时候传入数据 <app-header [msg]="msg"></app-header> 2. 子组件引入 Input 模块 imp ...
- layer.open中父页面向子页面传值
1.咱先看图说话 父list.jsp 子operate.jsp实现的代码1 在父页面上完成对子页面的数据渲染 function setData(data) { var lay=layer.open({ ...
- CTreeCtrl 父结点联动子结点CheckBox
实现很简单,直接上代码: void CCheckBoxTreeDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控 ...
- asp.net 实现treeview 选中父节点其子节点也选种中 选中子节点其父节点与根节点也被选中
1.在 Page_Load(object sender, EventArgs e) 里面加入: TreeView1.Attributes.Add("onclick", " ...
- C#中父窗口和子窗口之间实现控件互操作
很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见 ...
随机推荐
- js-jquery-Validate校验【一】
一.导入 js 库 <script src="http://static.runoob.com/assets/jquery-validation-1.14.0/lib/jquery.j ...
- NYOJ-1073 最小值
http://acm.nyist.net/JudgeOnline/problem.php?pid=1073 # include<stdio.h> # include<stdlib.h ...
- abap开发中update module 的创建和使用
一.update module 的创建和使用 最近遇到这样一个需求,需要先删除(delete)表中的数据,再将传递过来的新数据添加(modify)到表中. 但是如果下面modify的时候出现错误,使用 ...
- 【java】System.out重定向到文件,并重定向会console上
重定向到文件: System.setOut(new PrintStream(new File("data\\train.1.scale"))); 重定向回console: //把输 ...
- CloudFlare Support - Error 522: Connection timed out 错误522:连接超时
522错误意味着我们无法在所有到达原点Web服务器. 这方面有几个主要原因: 原始服务器太超载回应. 源Web服务器具有挡住了我们的请求的防火墙,或者数据包被主机的网络内下降. 源Web服务器脱机,或 ...
- 机器学习理论基础学习15---条件随机场(CRF)
一.CRF的由来HMM->MEMM->CRF 二.HMM到MEMM MEMM打破了HMM的观测条件独立假设 三.MEMM到CRF CRF克服了MEMM的label bias problem ...
- [lr & ps] 色彩空间管理
色彩空间 • 定义 色彩空间,Color Space,又称作色域.在色彩学中,人们建立了许多色彩模型,以一维.二维.三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间.我们经 ...
- html05
1.js中的对象-内置对象-外部对象-自定义对象 2.常见的内置对象有哪些?-String对象-Number对象-Boolean对象-Array对象-Math对象-Date对象-RegExp正则对象- ...
- 原生http模块与使用express框架对比
node的http创建服务与利用Express框架有何不同 原生http模块与使用express框架对比: const http = require("http"); let se ...
- MFC六大核心机制之五、六:消息映射和命令传递
作为C++程序员,我们总是希望自己程序的所有代码都是自己写出来的,如果使用了其他的一些库,也总是千方百计想弄清楚其中的类和函数的原理,否则就会感觉不踏实.所以,我们对于在进行MFC视窗程序设计时经常要 ...