广

ASP.NET

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    asp.net 2.0 权限树的控制

    2018-04-05 08:32:48 次阅读 稿源:互联网
    广告

          做权限的时候,主要实现如下功能
          1、该节点可以访问,则他的父节点也必能访问;
      2、该节点可以访问,则他的子节点也都能访问;
      3、该节点不可访问,则他的子节点也不能访问。
          使用带CheckBox的数型结构能得到很好的用户体验,可是编程的难度也是有点增加,如果全部有服务端来完成,那点下刷下,肯定不行,只能使用javascript,javascript调试的时候郁闷的很,一个字类,还有郁闷的递归,麻烦
      我以前是使用以下该方法
      <script language="javascript">
      <!--
              //初始化节点
              initchecknode(document.all("tvItemClientID").value,document.all("checked").value)
             
                  //初始化选中节点
                  function initchecknode(tree,tvvalue)
                  {
                      //获得需要初始化选择状态的节点的字符串.
                      var selectedNodes = tvvalue;
                      var arrayNodes = new Array();
                      arrayNodes = selectedNodes.split(",");
                      var AllRootNode=new Array();
                      AllRootNode=document.getElementById(tree).getChildren();
                      //初始化选择的节点
                      findAndCheckedNodes(AllRootNode,arrayNodes);
                  }

                  //根据已选择的节点的字符串初始化选择的节点
                  function findAndCheckedNodes(NodeArray,nodeDatas)
                  {
                      //alert(NodeArray.length);
                       if(parseInt(NodeArray.length)==0)
                       {
                          return;
                      }
                      else
                      {
                          for(var i=0;i<parseInt(NodeArray.length);i++)
                          {
                              var cNode,nodeData;
                              cNode=NodeArray[i];
                              ////如果该节点在nodeDatas里则初始化checked = true;
                              nodeData = cNode.getAttribute("NodeData");
                              for(var j=0;j<nodeDatas.length;j++)
                              {
                                  if(nodeDatas[j] == nodeData)
                                  {
                                      cNode.setAttribute("checked","true");
                                      break;
                                  }
                              }
                              //如果有子节点,则继续递归
                              if(parseInt(cNode.getChildren().length)!=0)
                              findAndCheckedNodes(cNode.getChildren(),nodeDatas);   
                          }
                      }
                  }
      //-->
      //oncheck事件
      function tree_oncheck(tree)
      {
       var i;
       var node=tree.getTreeNode(tree.clickedNodeIndex);
       var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");
       setcheck(node,Pchecked);
       setParent(node,Pchecked);
      //window.alert(Pchecked);
       document.all.checked.value = "";
       if (tree.getChildren().length > 0)
       {
          for (i=0;i<=tree.getChildren().length-1;i++)
          {
              if (tree.getChildren()[i].getAttribute("Checked"))
              {
                   AddChecked(tree.getChildren()[i]);
              }   
              FindCheckedFromNode(tree.getChildren()[i]);
          }
       }
      }
      //设置子节点选中

      function setcheck(node,Pchecked)
      {
       var i;
       var ChildNode=new Array();
       ChildNode=node.getChildren();
       
       if(parseInt(ChildNode.length)==0)
       {
        return;
       }
       else
       {
        for(i=0;i<ChildNode.length;i++)
        {
         var cNode;
         cNode=ChildNode[i];
         cNode.setAttribute("Checked",Pchecked);
         //cNode.Checked = Pchecked;
         if(parseInt(cNode.getChildren().length)!=0)
         {
          setcheck(cNode,Pchecked);
         }
        }
       }
      }

      //设置子节点选中/取消;
      //同时需要设置父节点的状态(如果是取消选中的话,仅仅设置本节点及其所有字接点,不涉及父接点)
      function setParent(node,Pc)
      {
          var parentNode = node.getParent();
       
          if(parentNode)
          {   
         
              var parentNodeFather = parentNode.getParent();
             
              if(parentNodeFather)
              {
                  setParent(parentNode,Pc);
              }
              if(Pc)
                  {parentNode.setAttribute("checked",Pc);}
              else
              {
                  checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
              }
          }
      }

      //检查子接点是否有选择的,如果有一个选择了,那返回true
      //只查第一级节点.
      function checkBrother(parentNode,Pc,NodeData)
      {
          var childNodes = new Array();
          childNodes = parentNode.getChildren();
          if(childNodes.length >0)
          {
              var bChecked = true;
              for(var i=0;i<childNodes.length;i++)
              {
                  if(childNodes[i].getAttribute("checked") == true &&  childNodes[i].getAttribute("NodeData") != NodeData)
                  {
                      //alert(i+childNodes[i].getAttribute("Text"));
                      bChecked = false;
                      break;
                  }
              }
              if(bChecked)
              {
                  parentNode.setAttribute("checked",Pc);
              }
              else
              {
                  //所有父结点选择
                  setParent(parentNode,!Pc)
              }
          }
          else
          {
              parentNode.setAttribute("checked",Pc);
          }
      }

      //获取所有节点状态
      function FindCheckedFromNode(node)
      {
       var i = 0;
       var nodes = new Array();
       nodes = node.getChildren();
       
       for (i = 0; i <= nodes.length - 1; i++)
       {
           if (nodes[i].getAttribute("Checked"))
           {
               AddChecked(nodes[i]);
           }
           if (parseInt(nodes[i].getChildren().length) != 0 )
           {
               FindCheckedFromNode(nodes[i]);
           }
       }
      }
      //添加选中节点
      function AddChecked(node)
      {
          document.all.checked.value += node.getAttribute("NodeData") + ",";
      }

      //-->
              </script>这种方法有个很大的问题,就是他客户端设置的CheckBox在服务器端是不能获取的,现在只能在Check的时候遍历树,并把Checked的值放在一个文本里,然后提交到服务器,然后服务器来解析1这种字符
                  现在我使用的是asp.net2.0,使用的是以下的方法
      function public_GetParentByTagName(element, tagName)
      {
          var parent = element.parentNode;
          var upperTagName = tagName.toUpperCase();
          //如果这个元素还不是想要的tag就继续上溯
          while (parent && (parent.tagName.toUpperCase() != upperTagName))
          {
              parent = parent.parentNode ? parent.parentNode : parent.parentElement;
          }
          return parent;
      }

      //设置节点的父节点Cheched——该节点可访问,则他的父节点也必能访问
      function setParentChecked(objNode)
      {
          var objParentDiv = public_GetParentByTagName(objNode,"div");
          if(objParentDiv==null || objParentDiv == "undefined")
          {
              return;
          }
          var objID = objParentDiv.getAttribute("ID");
          objID = objID.substring(0,objID.indexOf("Nodes"));
          objID = objID+"CheckBox";
          var objParentCheckBox = document.getElementById(objID);
          if(objParentCheckBox==null || objParentCheckBox == "undefined")
          {
              return;
          }
          if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "checkbox")
          return;
          objParentCheckBox.checked = true;
          setParentChecked(objParentCheckBox);
      }

      //设置节点的子节点uncheched——该节点不可访问,则他的子节点也不能访问
      function setChildUnChecked(divID)
      {
          var objchild = divID.children;
          var count = objchild.length;
          for(var i=0;i<objchild.length;i++)
          {
              var tempObj = objchild[i];
              if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
              {
                  tempObj.checked = false;
              }
              setChildUnChecked(tempObj);
          }
      }

      //设置节点的子节点cheched——该节点可以访问,则他的子节点也都能访问
      function setChildChecked(divID)
      {
          var objchild = divID.children;
          var count = objchild.length;
          for(var i=0;i<objchild.length;i++)
          {
              var tempObj = objchild[i];
              if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
              {
                  tempObj.checked = true;
              }
              setChildChecked(tempObj);
          }
      }

      //触发事件
      function CheckEvent()
      {

          var objNode = event.srcElement;

          if(objNode.tagName!="INPUT" || objNode.type!="checkbox")
          return;

          if(objNode.checked==true)
          {
              setParentChecked(objNode);
              var objID = objNode.getAttribute("ID");
              var objID = objID.substring(0,objID.indexOf("CheckBox"));
              var objParentDiv = document.getElementById(objID+"Nodes");
              if(objParentDiv==null || objParentDiv == "undefined")
              {
                  return;
              }
              setChildChecked(objParentDiv);
          }
          else
          {
              var objID = objNode.getAttribute("ID");
              var objID = objID.substring(0,objID.indexOf("CheckBox"));
              var objParentDiv = document.getElementById(objID+"Nodes");
              if(objParentDiv==null || objParentDiv == "undefined")
              {
                  return;
              }
              setChildUnChecked(objParentDiv);
          }
      }这种方法最大的好处就是服务端能得javascript设置的Checked的值,不用没点下就全部把树遍利下,直接在服务端遍利一次就行了
          //遍历子节点
          public void GetChildNode(TreeNode Node)
          {
              foreach (TreeNode node in Node.ChildNodes)
              {
                  if (node.Checked)
                  {
                      StrChecked += node.Value+"@";
                  }
                  GetChildNode(node);
              }
          }
      }我照样能得到它的Check的值

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告