此代码仅仅是二级结点,即父结点下面只有一层子结点,只有两层结构

        /// <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]的更多相关文章

  1. artdialog4.1.7 中父页面给子页面传值

    artdialog4.1.7中父页面给子页面传值时看了一些网友的解决方法: 在父页面声明全局变量 var returnValue=“ ”,子页面用art.dialog.opener.returnVal ...

  2. React中父组件与子组件之间的数据传递和标准化的思考

    React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...

  3. Vue中父组件向子组件传值

    Vue中父组件向子组件传值 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  4. 关于css中父元素与子元素之间margin-top的问题

    之前在使用经常遇到下面的问题: html: <div class="top"> <div class="one">I'm the fir ...

  5. angular中父组件给子组件传值-@input

    1. 父组件调用子组件的时候传入数据 <app-header [msg]="msg"></app-header> 2. 子组件引入 Input 模块 imp ...

  6. layer.open中父页面向子页面传值

    1.咱先看图说话 父list.jsp 子operate.jsp实现的代码1 在父页面上完成对子页面的数据渲染 function setData(data) { var lay=layer.open({ ...

  7. CTreeCtrl 父结点联动子结点CheckBox

    实现很简单,直接上代码: void CCheckBoxTreeDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控 ...

  8. asp.net 实现treeview 选中父节点其子节点也选种中 选中子节点其父节点与根节点也被选中

    1.在 Page_Load(object sender, EventArgs e) 里面加入: TreeView1.Attributes.Add("onclick", " ...

  9. C#中父窗口和子窗口之间实现控件互操作

    很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见 ...

随机推荐

  1. 洛谷P2634 聪聪可可 [国家集训队] 点分治/dp

    正解:点分治/dp 解题报告: 传送门! 这题有两个做法,都是我不擅长的就都说下好了QAQ 首先这题一看到就会想到点分治? 也确实可以用点分治,那就直接用点分治鸭 每次求出到当前根距离余数为0,1,2 ...

  2. seajs引入jquery为什么无效?

    简单来说,你的jquery没有模块化? 答案:传送门1.传送门2

  3. beginAppearanceTransition

    - (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated __OSX_AVAILABLE_STARTING ...

  4. CentOS工作内容(六)双网卡带宽绑定bind teaming

    CentOS工作内容(六)双网卡带宽绑定bind  teaming Teaming功能是什么功能http://zhidao.baidu.com/link?url=cpcwl9LH4FSHJBaTW-e ...

  5. eclipse整合spring+springMVC+Mybatis

    一.新建Maven项目 点击菜单栏File项,选择New->Project,选中Maven Project,如下图: 二.配置pom.xml <?xml version="1.0 ...

  6. bootstrap modal插件弹出窗口如何限制最大高度,并且在内容过多时可以滚动显示

    .modal-body{ max-height:400px; overflow-y:auto; } 只有在modal-body类上限制高度才能起作用,其他地方的限制均不起作用

  7. 视频处理工具FFmpeg的安装(windows/Linux)

    ♣FFmpeg是什么? ♣FFmpeg组成 ♣下载工具 ♣安装FFmpeg ♣应用到j2ee项目 前言:学习视频编码,一定要知道雷霄骅(leixiaohua1020)的专栏 ,伟大的程序员,26岁去世 ...

  8. C#读取Excel,Access数据库

    出自:http://blog.csdn.net/limpire/article/details/2599760 使用 OpenRowSet 和 OpenDataSource 访问 Excel 97-2 ...

  9. linux两种类型服务管理

    linux服务分成两个大类 一.rpm包安装  ---------独立的服务  和  基于xinetd服务 二.源代码安装 rpm包安装的服务,查看命令是 chkconfig --list rpm安装 ...

  10. Verilog篇(四)时序模型

    时序模型:仿真器的时间推进模型,它反映了推进仿真时间和调度事件的方式. 1)门级时序模型:适用于分析所有的连续赋值语句,过程连续赋值语句,门级原语,用户自定义原语. 特点:任意时刻,任意输入变化都将重 ...