国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

asp.net 2.0 權限樹的控制

2024-07-10 13:09:16
字體:
來源:轉載
供稿:網友

    做權限的時候,主要實現如下功能
    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的值放在一個文本里,然后提交到服務器,然后服務器來解析[email protected]@這種字符
            現在我使用的是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的值


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金塔县| 获嘉县| 巩留县| 龙里县| 平昌县| 灵丘县| 汕尾市| 德保县| 克什克腾旗| 库尔勒市| 阿拉善右旗| 洛宁县| 龙胜| 上饶县| 建德市| 田林县| 宾川县| 灵武市| 金寨县| 乐昌市| 吉首市| 鹤峰县| 康定县| 杭锦后旗| 兰溪市| 嵊泗县| 旅游| 阳东县| 万全县| 尼玛县| 沅江市| 固阳县| 永顺县| 小金县| 论坛| 昌吉市| 晋中市| 苏尼特左旗| 鄄城县| 淄博市| 建平县|