自己在网上找了一段时间都没有找到取自数据库的值与TreeView中的节点值进行对比如匹配则勾选中CheckBox的资料,后面自己写了一个递归方法实现,现在记录起来以备需要时使用。在没写这递归方法前如果需要一个一个对比深度为4的TreeView 需要不少于5个for循环,写太多内嵌的for循环觉得不好,因此写了以下的方法。
/// <summary> /// 递归实现与TreeView节点值对比,如相同则该节点的CheckBox=True /// </summary> /// <param name="parentNode">节点</param> /// <param name="value">对比值</param> private void SetTreeViewChecked(TreeNode parentNode, int value) { foreach (TreeNode node in parentNode.ChildNodes) { if (node.Value == value.ToString()) { node.Checked = true; } if (node.ChildNodes.Count > 0) { SetTreeViewChecked(node, value); } } } //获取最后一次选择CheckBoxList勾选中的值 protected void CheckRole_SelectedIndexChanged(object sender, EventArgs e) { string s = Request.Form["__EVENTTARGET"]; int index = Convert.ToInt32(s.Substring(s.LastIndexOf("$") + 1)); BindListView(TreeViewMenu);//重新加载菜单 TreeViewMenu.ExpandAll(); if (CheckRole.Items[index].Selected) { labRoleId.Text = CheckRole.Items[index].Value.ToString(); labRole.Text = CheckRole.Items[index].Text.ToString(); //根据角色名选查看所拥有的菜单权限 DataTable dt = menuPerBll.GetListOfRoleId(Convert.ToInt32(labRoleId.Text)).Tables[0]; //根据所选角色勾选已拥有的菜单 if (dt.Rows.Count > 0) { for (int j = 0; j < dt.Rows.Count; j++) { for (int i = 0; i < TreeViewMenu.Nodes.Count; i++) { SetTreeViewChecked(TreeViewMenu.Nodes[i], Convert.ToInt32(dt.Rows[j]["MenuId"].ToString())); //对比如值匹配的则checkBox的checked=true } } } } else { labRoleId.Text = ""; labRole.Text = ""; } }
时间: 2024-10-05 23:25:24