zoukankan      html  css  js  c++  java
  • 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);
                }
            }
  • 相关阅读:
    Window 下配置ChromeDriver(简单4步完成)[转]
    selenium之 chromedriver与chrome版本映射表(更新至v2.46)[转]
    学习网站
    如何理解python中的类和方法(转)
    面试题整理20191127
    mysql 慢查询
    python学习--代码组织实例
    ubuntu下安装Matlab
    SkinPP for VC
    C++中的4个类型转换关键字
  • 原文地址:https://www.cnblogs.com/ingvner/p/7225352.html
Copyright © 2011-2022 走看看