原创 2011年01月18日 18:43:00

       private List<DataRow> list = new List<DataRow>();

        Boolean afterCheck = true;

        /// <summary>
        /// 当已选中或取消树复选框时触发
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard)
            {
                if (afterCheck)
                {
                    afterCheck = false;
                    if (e.Node == null) return;
                    TreeNode treeNode = e.Node;
                    if (treeNode.Checked)
                    {
                        TreeNode treeNodeTemp = treeNode;
                        #region
                        if (treeNodeTemp.Nodes.Count != 0)
                        {
                            AddMjNodeList(treeNodeTemp, true);
                        }
                        else
                        {
                            if (treeNodeTemp.Tag !=null)
                            list.Add((DataRow)treeNodeTemp.Tag);
                        }
                        #endregion
                        while (treeNodeTemp.Parent != null)
                        {
                            treeNodeTemp = treeNodeTemp.Parent;
                            if (!treeNodeTemp.Checked)
                            {
                                treeNodeTemp.Checked = treeNode.Checked;
                            }
                        }
                    }
                    /// 添加人员: 阿朝
                    /// 添加时间: 20090724
                    else
                    {
                        int state = 0;
                        TreeNode treeNodeTemp = treeNode;
                        #region
                        if (treeNodeTemp.Nodes.Count != 0)
                        {
                            AddMjNodeList(treeNodeTemp, false);
                        }
                        else
                        {
                            if (treeNodeTemp.Tag!=null)
                            DeleteList(list, treeNodeTemp);
                        }
                        #endregion
                        while (treeNodeTemp.Parent != null)
                        {
                            if (CheckPrevOrNextNode(treeNodeTemp))
                            {
                                state = 1;
                            }
                            treeNodeTemp = treeNodeTemp.Parent;
                            treeNodeTemp.Checked = Convert.ToBoolean(state);
                        }
                    }
                    treeViewNodesCheck(treeNode, treeNode.Checked);

                    afterCheck = true;
                }
            }
        }

         /// <summary>
        /// 选中节点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            //if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard)
            //{
            //    if (afterCheck)
            //    {
            //        afterCheck = false;
            //        //if (!btnSave.Enabled) btnSave.Enabled = true;
            //        //if (!btnCancel.Enabled) btnCancel.Enabled = true;
            //        if (e.Node == null) return;
            //        TreeNode treeNode = e.Node;
            //        if (treeNode.Checked)
            //        {
            //            TreeNode treeNodeTemp = treeNode;
            //            while (treeNodeTemp.Parent != null)
            //            {
            //                treeNodeTemp = treeNodeTemp.Parent;
            //                if (!treeNodeTemp.Checked)
            //                {
            //                    treeNodeTemp.Checked = treeNode.Checked;
            //                }
            //            }
            //        }
            //        /// 添加人员:  阿朝
            //        /// 添加时间: 20090724
            //        else
            //        {
            //            int state = 0;
            //            TreeNode treeNodeTemp = treeNode;

            //            while (treeNodeTemp.Parent != null)
            //            {
            //                if (CheckPrevOrNextNode(treeNodeTemp))
            //                {
            //                    state = 1;
            //                }
            //                treeNodeTemp = treeNodeTemp.Parent;
            //                treeNodeTemp.Checked = Convert.ToBoolean(state);

            //            }
            //        }
            //        treeViewNodesCheck(treeNode, treeNode.Checked);

            //        afterCheck = true;
            //    }
            //}
        }

        #region 树方法

        private void treeViewNodesCheck(TreeNode treeNode, Boolean check)
        {
            foreach (TreeNode treeNodeChild in treeNode.Nodes)
            {
                treeNodeChild.Checked = check;
                treeViewNodesCheck(treeNodeChild, check);
            }
        }

        /// <summary>
        /// 添加人员: 阿朝
        /// 添加时间: 20090724
        /// </summary>
        /// <param name="node"></param>
        private bool CheckPrevOrNextNode(TreeNode node)
        {
            bool falg = false;

            /// 检查同级的前个节点是否选中
            while (node.PrevNode != null)
            {
                if (node.PrevNode.Checked)
                {
                    falg = true;
                    break;
                }
                else
                {
                    node = node.PrevNode;
                }
            }
            /// 检查同级节点的后一个节点是否选中
            while (node.NextNode != null)
            {
                if (node.NextNode.Checked)
                {
                    falg = true;
                    break;
                }
                else
                {
                    node = node.NextNode;
                }
            }
            return falg;
        }

        #endregion

 

 

  private void DeleteList(List<DataRow> listRow,TreeNode treeNodeNew)
   {
            List<DataRow> listRowCopy = new List<DataRow>();
            foreach (DataRow drownew in listRow)
            {
                listRowCopy.Add(drownew);
            }
            foreach (DataRow drow in listRowCopy)
            {
                DataRow drowNew = (DataRow)treeNodeNew.Tag;
                if (drowNew["sdx"].ToString() == drow["sdx"].ToString())
                {
                    list.Remove(drowNew);
                }
            }
        }

 

        private void AddMjNodeList(TreeNode treeNodeNew,bool falg)
        {

            if (treeNodeNew.Nodes.Count == 0)
            {
                if (falg)
                {
                    list.Add((DataRow)treeNodeNew.Tag);
                }
                else
                {
                    DeleteList(list,treeNodeNew);
                }
            }
            else
            {
                for (int i = 0; i < treeNodeNew.Nodes.Count; i++)
                {
                    AddMjNodeList(treeNodeNew.Nodes[i], falg);
                }
            }
              
                //TreeNode treeNodeNext = treeNodeNew.NextNode;
                //if (treeNodeNext != null)
                //{
                //    AddMjNodeList(treeNodeNext, falg);
                //}
                //TreeNode treeNodeprv = treeNodeNew.PrevNode;
                //if (treeNodeprv != null)
                //{
                //    AddMjNodeList(treeNodeprv, falg);
                //}
        
            //while (treeNodeNew.NextNode != null)
            //{
            //    //TreeNode treeNodeNext = treeNodeNew.NextNode;
            //    //if (treeNodeNext != null)
            //    //{
            //    AddMjNodeList(treeNodeNew.NextNode, falg);
            //    //}
            //}
            //while (treeNodeNew.PrevNode != null)
            //{
            //    //TreeNode treeNodeprv = treeNodeNew.PrevNode;
            //    //if (treeNodeprv != null)
            //    //{
            //    AddMjNodeList(treeNodeNew.PrevNode, falg);
            //    //}
            //}
    
        }

B树,B-树和B+树的区别

B树        即二叉搜索树:        1.所有非叶子结点至多拥有两个儿子(Left和Right);        2.所有结点存储一个关键字;        3.非叶子结点的左指针...
  • zwz2011303359
  • zwz2011303359
  • 2017年03月18日 17:26
  • 3187

B-树详细分析及B树B-树B+树B*树概念

B- 树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。 B- 树又叫平衡多路查找树。一棵m阶的B 树 (m叉树)的...
  • guanyasu
  • guanyasu
  • 2016年12月03日 11:04
  • 649

2-3-4树、红黑树、B树

本总结是是个人为防止遗忘而作,不得转载和商用。 2-3-4树                   如上图所示。          有的节点存一个值,则有2个孩子,如:           ...
  • xueyingxue001
  • xueyingxue001
  • 2016年10月27日 14:52
  • 802

查找三 多路查找树(2-3树,2-3-4树,B树、B+树)

应用场景:解决在硬盘中的大量数据中的查找。因为大量数据存储在硬盘中,不能一次全部加载到内存中,而每次查一个数据读一次硬盘,读取速度太慢,这时就需要使用一种数据结构一部分一部分读入,这就是多路查找树的作...
  • u010512964
  • u010512964
  • 2017年07月26日 00:01
  • 404

浅谈AVL树,红黑树,B树,B+树原理及应用

背景:这几天在看《高性能Mysql》,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使用B+Tre...
  • whoamiyang
  • whoamiyang
  • 2016年07月18日 09:36
  • 5454

K-D树

K-D树,即K-Dimensional Tree,是一种高维索引树型数据结构。常用于大规模高维数据空间的最邻近或者K邻 近查找,例如图像检索中高维图像特征向量的K邻近匹配,对KNN算法的优化等。   ...
  • ACdreamers
  • ACdreamers
  • 2015年03月27日 01:49
  • 8198

树的定义及基本操作

首先,什么是树呢? 数的定义是递归的: 定义树是满足以下条件的,包含至少一个结点的有限集合: (1)树中有一个特别指定的结点,称为根,或树根。 (2)其它结点划分成n>=0个不相交的集合T1…...
  • thefutureisour
  • thefutureisour
  • 2012年08月17日 10:52
  • 4326

最短路径树问题

最短路径树问题时间限制: 1 Sec 内存限制: 128 MB 题目描述 给一个包含n个点,m条边的无向连通图。从顶点1出发,往其余所有点分别走一次并返回。 往某一个点走时,选择总长度...
  • wcy_1122
  • wcy_1122
  • 2015年11月15日 10:17
  • 3822

noip2004 FBI树 (树的后序遍历)

A1149. FBI树 时间限制:1.0s   内存限制:256.0MB   总提交次数:582   AC次数:286   平均分:63.64 将本题分享到:     ...
  • yuyanggo
  • yuyanggo
  • 2015年08月30日 18:43
  • 1746

理解WPF中的视觉树和逻辑树

理解WPF中的视觉树和逻辑树  Understanding the Visual Tree and Logical Tree in WPF 这篇文章讨论WPF中视觉树和逻辑树的细微差别。同时提供了一个...
  • changtianshuiyue
  • changtianshuiyue
  • 2014年05月25日 21:50
  • 10569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:
举报原因:
原因补充:

(最多只允许输入30个字)