Winform 、asp.net TreeView 树形控件

生成树形控件并实现节点状态的变化,这些方法是先在winform中的实现的,后用asp.net改写了,差距只是几个属性的名字有改动而已。详细解释代码中都已列出。

    #region TreeView 树形控件

        /// <summary>
        /// 用于把所有的节点信息从数据库提取出来,然后添加到窗体的树形控件中
        /// </summary>
        private void InitTreeView()
        {
            //获得数据库里面的所有节点信息
            string sql = @"select TransportID,TransportType,SMS_ParentNode from M_SMS_TransportType";
            DataSet ds = GetData(sql);
            DataTable dt = ds.Tables[0];
            //提取所有的根节点 (提取条件为:SMS_ParentNode为0的记录)
            var parents = from p in dt.AsEnumerable()//查找第一层节点即所有父节点
                          where p.Field<int>("SMS_ParentNode") == 0
                          orderby p.Field<int>("TransportID")
                          select p;

            //遍历每个根节点
            //遍历过程中将每一个根节点的子节点加到根节点的Nodes属性中
            //最后将根节点加入到TreeView控件中)
            //
            foreach (var parent in parents)
            {
                //创建一个根节点
                TreeNode parentNode = new TreeNode();

                //提取根节点的所有子节点,提取条件:根节点所代表的记录的Id(TransportID)等于子节点所代表的记录的父ID(SMS_ParentNode)
                var child = from c in dt.AsEnumerable()
                            where c.Field<int>("SMS_ParentNode") == parent.Field<int>("TransportID")//通过子节点的父节点Id等于父节点ID查找子节点
                            orderby c.Field<int>("TransportID")
                            select c;
                //遍历当前根节点的子节点,并且每遍历一次,就生成一个子节点,并将子节点添加到父节点的Nodes属性中
                foreach (var children in child)
                {
                    //创建一个子节点
                    TreeNode childrenNode = new TreeNode();
                    childrenNode.Text = children.Field<string>("TransportType");
                    childrenNode.ToolTip = children.Field<int>("TransportID").ToString();
                    //将子节点添加到父节点中
                    parentNode.ChildNodes.Add(childrenNode);//添加子节点
                }
                parentNode.Text = parent.Field<string>("TransportType");
                parentNode.ToolTip = parent.Field<int>("TransportID").ToString();

                //将父节点添加到TreeView控件中
                this.TreeView1.Nodes.Add(parentNode);
            }
        }

        #region 节点状态变化功能

        /// <summary>
        /// 节点选中状态更改后触发
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
        {
            //如果一个节点被勾选
            if (e.Node.Checked == true)
            {
                //将该节点的所有直接子节点以及间接子节点都勾选上
                SetChildNodesCheckedOrUnChecked(e.Node, true);
                //将该节点的直接父节点以及间接父节点都勾选上
                SetParentNodesChecked(e.Node);
            }
            else//如果一个节点被取消勾选
            {
                //将该节点的所有直接子节点以及间接子节点都取消勾选
                SetChildNodesCheckedOrUnChecked(e.Node, false);
                //设置该节点的直接父节点以及间接父节点的状态(父节点的状态可能被取消勾选,也不可能被取消)
                SetParentNodesUnChecked(e.Node);
            }
        }

        /// <summary>
        /// 用于设置当前所选节点的子节点的状态
        /// 如果当前所选的节点是勾选状态,那么它的所有子节点都被勾选上
        /// 如果当前所选的节点是不勾选状态,那么它的所有子节点都不被勾选上
        /// </summary>
        /// <param name="node">当前所选节点</param>
        /// <param name="state">当前所选节点的状态:true或false</param>
        private void SetChildNodesCheckedOrUnChecked(TreeNode node, bool state)
        {
            if (node.ChildNodes.Count > 0)
            {
                TreeNodeCollection childNodes = node.ChildNodes;
                foreach (TreeNode child in childNodes)
                {
                    child.Checked = state;
                    SetChildNodesCheckedOrUnChecked(child, state);
                }
            }
        }

        /// <summary>
        /// 将当前被勾选上的节点的直接父节点以及间接父节点勾选上
        /// </summary>
        /// <param name="node">当前被勾选的节点</param>
        private void SetParentNodesChecked(TreeNode node)
        {
            TreeNode parent = node.Parent;
            if (parent != null)
            {
                parent.Checked = true;

                SetParentNodesChecked(node.Parent);
            }
        }

        /// <summary>
        /// 设置当前取消勾选的节点的直接父节点以及间接父节点的状态
        /// </summary>
        /// <param name="node">当前被取消勾选的节点</param>
        private void SetParentNodesUnChecked(TreeNode node)
        {
            TreeNode parent = node.Parent;

            if (parent != null)
            {
                parent.Checked = false;
                TreeNodeCollection childNodesOfParent = node.Parent.ChildNodes;

                foreach (TreeNode childNodeOfParent in childNodesOfParent)
                {
                    if (childNodeOfParent.Checked == true)
                    {
                        parent.Checked = true;
                        break;
                    }
                }
                SetParentNodesUnChecked(node.Parent);
            }
        }

        /// <summary>
        /// 设置用户对应的节点
        /// </summary>
        private void GetUserNodes()
        {
            //获取当前选择用户的UerID
            string name = GridView1.SelectedRow.Cells[0].Text;
            string phone = GridView1.SelectedRow.Cells[1].Text;
            string sql = @"SELECT UserID FROM M_SMS_CatConfiguration  
                           WHERE SMS_UserName='" + name + "'  AND SMS_Del='" + phone + "'";
            DataSet ds = GetData(sql);
            string userId = ds.Tables[0].Rows[0]["UserID"].ToString();

            //根据用户的UserID获取节点信息
            string sql1 = @"SELECT UT.UserID,UT.TransportID,TransportType
                            FROM UserIDTransportID UT left join M_SMS_TransportType T ON UT.TransportID =T.TransportID
                            WHERE UT.UserID='" + userId + "'";
            DataSet ds1 = GetData(sql1);

            //遍历节点信息表的所有行
            foreach (DataRow row in ds1.Tables[0].Rows)
            {
                //获取当前行的节点信息名称
                string nodeTest = row["TransportType"].ToString();
                //设置当前用户对应节点状态
                SetUserNodesChecked(nodeTest, TreeView1.Nodes);
            }
        }

        /// <summary>
        /// 设置用户对应的节点
        /// </summary>
        private void SetUserNodesChecked(string nodeTest, TreeNodeCollection nodes)
        {
            foreach (TreeNode node in nodes)
            {
                if (nodeTest.Trim() == node.Text.Trim().ToString())
                {
                    node.Checked = true;
                    //将该节点的所有直接子节点以及间接子节点都勾选上
                    SetChildNodesCheckedOrUnChecked(node, true);
                    //将该节点的直接父节点以及间接父节点都勾选上
                    SetParentNodesChecked(node);
                }
                SetUserNodesChecked(nodeTest, node.ChildNodes);
            }

        }

        #endregion

        /// <summary>
        /// 从当前窗口获得用户的节点信息,添加到集合中
        /// </summary>
        private void GetNodeFromPage(List<int> lstNodeOfTree, TreeNodeCollection nodes)
        {
            ///遍历节点集合
            foreach (TreeNode node in nodes)
            {
                //如果节点存在子节点,递归调用
                if (node.ChildNodes.Count > 0)
                {
                    GetNodeFromPage(lstNodeOfTree, node.ChildNodes);
                }
                else//该节点若无子节点,判断是否为选中状态
                {
                    if (node.Checked == true)
                    {
                        lstNodeOfTree.Add(int.Parse(node.ToolTip));
                    }
                }
            }
        }

        /// <summary>
        /// 保存当前用户节点信息
        /// </summary>
        /// <param name="userId"></param>
        private void SaveTreeNode(string name, string phone)
        {
            //根据用户的名字和手机号获取用户ID
            string sqlSelect = @"SELECT UserID FROM M_SMS_CatConfiguration WHERE SMS_UserName='" + name + "'  AND SMS_Del='" + phone + "'";
            DataSet ds = GetData(sqlSelect);
            string userId = ds.Tables[0].Rows[0]["UserID"].ToString().Trim();

            //获取设置的节点信息
            List<int> lstNodeOfTree = new List<int>();
            GetNodeFromPage(lstNodeOfTree, this.TreeView1.Nodes);

            //删除数据库中现有的存储的节点信息
            string sqlDelete = @"DELETE FROM UserIDTransportID  WHERE UserID='" + userId + "'";
            UpdateData(sqlDelete);

            //重新在数据库中添加节点信息
            foreach (int Id in lstNodeOfTree)
            {
                string sql = @"INSERT INTO UserIDTransportID(UserID,TransportID) VALUES('" + userId + "' ,'" + Id + "')";
                UpdateData(sql);
            }
        }

        /// <summary>
        /// 把树形控件中的所有复选框置为不勾选
        /// </summary>
        /// <param name="tnc">树形控件的直接子节点集合或者某个节点的所有子节点</param>
        private void ClearTreeNodeChecked(TreeNodeCollection nodes)
        {
            foreach (TreeNode node in nodes)
            {
                node.Checked = false;
                //递归调用
                ClearTreeNodeChecked(node.ChildNodes);
            }
        }
原文地址:https://www.cnblogs.com/ingvner/p/7225352.html