zoukankan      html  css  js  c++  java
  • winform treeview checkbox递归算法利用

    在平常开发中,treeview的节点显示checkbox,若节点存在几级时,往往希望,选中父节点后,其子节点都要选中,如何实现勒,请看image

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace SmartHome
    {
        public partial class TreeViewAndCheckbox : Form
        {
            public TreeViewAndCheckbox()
            {
                InitializeComponent();
                //treeview显示checkbox
                treeView1.CheckBoxes = true;
                TreeViewUtil.ShowTreeViewInfo(treeView1);
                this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);
    
            }
    
    
            private void TreeViewAndCheckbox_Load(object sender, EventArgs e)
            {
                treeView1.ExpandAll();
            }
    
            private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
    
                if (e.Action == TreeViewAction.ByMouse)
                {
                    textBox1.Text = e.Node.Text;
                    if (e.Node.Checked)
                    {
                        //取消节点选中状态之后,取消所有父节点的选中状态
                        setChildNodeCheckedState(e.Node, true);
    
                    }
                    else
                    {
                        //取消节点选中状态之后,取消所有父节点的选中状态
                        setChildNodeCheckedState(e.Node, false);
                        //如果节点存在父节点,取消父节点的选中状态
                        if (e.Node.Parent != null)
                        {
                            setParentNodeCheckedState(e.Node, false);
                        }
                    }
                }
            }
            //取消节点选中状态之后,取消所有父节点的选中状态
            private void setParentNodeCheckedState(TreeNode currNode, bool state)
            {
                TreeNode parentNode = currNode.Parent;
    
                parentNode.Checked = state;
                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;
                        setChildNodeCheckedState(tn, state);
                    }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                int i = 0;
                foreach (TreeNode tn in treeView1.Nodes)
                {
                    if (tn.Checked)
                        i++;
                    foreach (TreeNode item in tn.Nodes)
                    {
                        if (item.Checked)
                        {
                            i++;
                        }
                        foreach (TreeNode nd in item.Nodes)
                        {
                            if (nd.Checked)
                            {
                                i++;
                            }
    
                        }
    
                    }
                    textBox2.Text = i.ToString();
    
                }
    
            }
    
            /// <summary>
            /// 查询treeNode节点下有多少节点被选中(递归实现,不受级数限制)
            /// </summary>
            /// <param name="tv"></param>
            /// <returns></returns>
            private int GetNodeChecked(TreeNode tv)
            {
                int x = 0;
                if (tv.Checked)
                {
                    x++;  
                }
                foreach (TreeNode item in tv.Nodes)
                {
                   x+= GetNodeChecked(item);
    
                }
                return x;
    
            }
    
            /// <summary>
            /// 查询TreeView下节点被checked的数目
            /// </summary>
            /// <param name="treev"></param>
            /// <returns></returns>
            private int GetTreeViewNodeChecked(TreeView treev)
            {
                int k = 0;
                foreach (TreeNode item in treev.Nodes)
                {
                    k += GetNodeChecked(item);
                }
                return k;
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
    
                textBox2.Text = GetTreeViewNodeChecked(treeView1).ToString();
            }
    
    
        }
    }
  • 相关阅读:
    vue 仿IOS 滚轮选择器
    一道题目学ES6 API,合并对象id相同的两个数组对象
    Express中间件原理详解
    webpack原理与实战
    LS522 体积小低电压低成本的13.56MHz非接触式读写卡芯片,集成了在13.56MHz下所有类型的被动非接触式通信方式和协议,支持ISO14443A/B的多层应用( PIN对PIN MFRC522 )
    SP213EEA-L/TR +5V高性能RS232收发器
    多速率SDI集成接收器 SDI解码芯片 GS2971A-IBE3
    低电容3.3V TVS管 R CLAMP3304N.TCT
    高ESD耐压/TVS二极管 UCLAMP2804L.TCT
    高性能正电压稳压管SC4215HSETRT
  • 原文地址:https://www.cnblogs.com/ITBread/p/2399581.html
Copyright © 2011-2022 走看看