生成树形控件并实现节点状态的变化,这些方法是先在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); } }