zoukankan      html  css  js  c++  java
  • asp.net 2.0 TreeView客户端个性化控制

        asp.net 2.0 的 TreeView 控件功能虽说强大,但其客户端控制很逊色,本文将讲解 TreeView 的客户端实现原理,并实现两个个性化操作:
    (1) 节点的全部打开和关闭;
    Client Side Expand/Collapse All Nodes For ASP.NET 2.0 TreeView.
    (2) 只打开一个节点(关闭其他兄弟节点)。
    Just one expanded node in ASP.NET 2.0 TreeView (When a client expand one node all other will collaps)
    用记事本打开页面源代码,可以找到一下两个脚本引用:

    <script src="/WebUI/WebResource.axd?d=RAQeBcDUNuP9iuS8q3tNEw2&amp;t=633300220640000000" type="text/javascript"></script>
    <script src="/WebUI/WebResource.axd?d=JuTdJhq3NM8Jq_RhssAkEg2&amp;t=633300220640000000" type="text/javascript"></script>

        将"/WebUI/WebResource.axd?d=RAQeBcDUNuP9iuS8q3tNEw2&amp;t=633300220640000000"拷到地址栏尾,下载脚本,并以 .js 命名,另一个同样操作。分析第二个脚本文件,可以看到TreeView的很多客户端函数,其中关键的一个 TreeView_ToggleNode 就是客户端点击时触发的事件。
        要想做个性化的操作,就得从 TreeView_ToggleNode 事件下手。我们无法更改.net封装好的脚本,只有“重写”。所谓的重写就是在原来的函数之后添加一个同名函数(因为js对于同名函数只调用最后一个)。

    TreeView_ToggleNode 的原函数:

    function TreeView_ToggleNode(data, index, node, lineType, children) {
        
    var img = node.childNodes[0];
        
    var newExpandState;
        
    try {
            
    if (children.style.display == "none"{
                children.style.display 
    = "block";
                newExpandState 
    = "e";
                
    if ((typeof(img) != "undefined"&& (img != null)) {
                    
    if (lineType == "l"{
                        img.src 
    = data.images[15];
                    }

                    
    else if (lineType == "t"{
                        img.src 
    = data.images[12];
                    }

                    
    else if (lineType == "-"{
                        img.src 
    = data.images[18];
                    }

                    
    else {
                        img.src 
    = data.images[5];
                    }

                    img.alt 
    = data.collapseToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
                }

            }

            
    else {
                children.style.display 
    = "none";
                newExpandState 
    = "c";
                
    if ((typeof(img) != "undefined"&& (img != null)) {
                    
    if (lineType == "l"{
                        img.src 
    = data.images[14];
                    }

                    
    else if (lineType == "t"{
                        img.src 
    = data.images[11];
                    }

                    
    else if (lineType == "-"{
                        img.src 
    = data.images[17];
                    }

                    
    else {
                        img.src 
    = data.images[4];
                    }

                    img.alt 
    = data.expandToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
                }

            }

        }

        
    catch(e) {}
        data.expandState.value 
    =  data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);
    }

    1. 节点的全部打开和关闭(Client Side Expand/Collapse All Nodes)

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        
    <title>LeftMenu_Tree</title>
    </head>
    <body bgcolor="#DDEDFD">
        
    <form id="form1" runat="server">
            
    <href="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', true)">Expand
                All
    </a> <href="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', false)">
                    Collapse All
    </a>
            
    <asp:TreeView ID="TreeView1" SkinID="tvClass" runat="server" ShowLines="true" NodeWrap="false">
            
    </asp:TreeView>
        
    </form>
    </body>
    </html>

    <script language="javascript">
    //-----------------------------------------------------------------------------
    function $(s){return document.getElementById(s);}
    function isNull(_sVal){return (_sVal == "" || _sVal == null || _sVal == "undefined");}

    function TreeviewExpandCollapseAll(treeViewId, expandAll)
    {
        
    var displayState = (expandAll == true ? "none" : "block");
        
    var treeView = $(treeViewId);
        
    if(treeView)
        
    {
            
    var treeLinks = treeView.getElementsByTagName("a");
            
    var nodeCount = treeLinks.length;
            
    var flag = true;
            
    for(i=0;i<nodeCount;i++)
            
    {
                
    if(treeLinks[i].firstChild.tagName)
                
    {
                    
    if(treeLinks[i].firstChild.tagName.toLowerCase() == "img")
                    
    {
                        
    var node = treeLinks[i];
                        
    var level = parseInt(node.id.substr(node.id.length - 1),10);
                        
    var childContainer = GetParentByTagName("table", node).nextSibling;
                        
    if(!isNull(childContainer))
                        
    {
                            
    if(flag)
                            
    {
                                
    if(childContainer.style.display == displayState)
                                
    {
                                    TreeView_ToggleNode(eval(treeViewId 
    +"_Data"),level,node,'r',childContainer);
                                }

                                flag 
    = false;
                            }

                            
    else
                            
    {
                                
    if(childContainer.style.display == displayState)
                                
    {
                                    TreeView_ToggleNode(eval(treeViewId 
    +"_Data"),level,node,'l',childContainer);
                                }

                            }

                        }

                    }

                }

            }
    //for loop ends
        }

    }


    function GetParentByTagName(parentTagName, childElementObj)
    {
        
    var parent = childElementObj.parentNode;
        
    while(parent.tagName.toLowerCase() != parentTagName.toLowerCase())
        
    {
            parent 
    = parent.parentNode;
        }

        
    return parent;
    }

    //-----------------------------------------------------------------------------
    </script>
    2. 只打开一个节点,关闭其他兄弟节点(Just one expanded node, all other will collaps)
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        
    <title>LeftMenu_Tree</title>
    </head>
    <body bgcolor="#DDEDFD">
        
    <form id="form1" runat="server">
            
    <href="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', true)">Expand
                All
    </a> , <href="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', false)">
                    Collapse All
    </a>
            
    <asp:TreeView ID="TreeView1" SkinID="tvClass" runat="server" ShowLines="true" NodeWrap="false">
            
    </asp:TreeView>
        
    </form>
    </body>
    </html>

    <script language="javascript">
    //2. 只打开一个节点,关闭其他兄弟节点(Just one expanded node, all other will collaps)
    function TreeView_ToggleNode(data, index, node, lineType, children) 
    {
        
    var img = node.childNodes[0];
        
    var newExpandState;
        
    try {
            
    //***折叠兄弟节点(Collapse Brothers)-----
            CollapseBrothers(data,children);
            
    //---------------------------------------
                
            
    if (children.style.display == "none"
            
    {
                children.style.display 
    = "block";
                newExpandState 
    = "e";
                
    if ((typeof(img) != "undefined"&& (img != null)) 
                
    {
                    
    if (lineType == "l"
                    
    {
                        img.src 
    = data.images[15];
                    }

                    
    else if (lineType == "t"
                    
    {
                        img.src 
    = data.images[12];
                    }

                    
    else if (lineType == "-"
                    
    {
                        img.src 
    = data.images[18];
                    }

                    
    else 
                    
    {
                        img.src 
    = data.images[5];
                    }

                    img.alt 
    = data.collapseToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
                }

            }

            
    else 
            
    {
                children.style.display 
    = "none";
                newExpandState 
    = "c";
                
    if ((typeof(img) != "undefined"&& (img != null)) 
                
    {
                    
    if (lineType == "l"
                    
    {
                        img.src 
    = data.images[14];
                    }

                    
    else if (lineType == "t"
                    
    {
                        img.src 
    = data.images[11];
                    }

                    
    else if (lineType == "-"
                    
    {
                        img.src 
    = data.images[17];
                    }

                    
    else 
                    
    {
                        img.src 
    = data.images[4];
                    }

                    img.alt 
    = data.expandToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
                }

            }

        }

        
    catch(e) {}
        data.expandState.value 
    =  data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);
    }


    //折叠兄弟节点(Collapse Brothers)
    function CollapseBrothers(data,childContainer)
    {
        
    var parent = childContainer.parentNode;   
        
    for(i=0; i< parent.childNodes.length; i++)
        
    {
            
    if(parent.childNodes[i].tagName.toLowerCase() =="div")
            
    {
                
    if(parent.childNodes[i].id != childContainer.id)
                
    {
                    parent.childNodes[i].style.display 
    = "none"
                }

            }

            
    else if(parent.childNodes[i].tagName.toLowerCase() =="table")
            
    {
                
    var treeLinks = parent.childNodes[i].getElementsByTagName("a");            
                
    if(treeLinks.length > 2)
                
    {
                    
    var j=0;
                    
    if(treeLinks[j].firstChild.tagName)
                    
    {
                        
    if(treeLinks[j].firstChild.tagName.toLowerCase() == "img")
                        
    {
                            
    var img = treeLinks[j].firstChild;
                            
    if(i==0
                                img.src 
    = data.images[8];
                            
    else if(i==parent.childNodes.length-2
                                img.src 
    = data.images[14];
                            
    else 
                                img.src 
    = data.images[11];
                        }

                    }
        
                }

            }
            
        }

    }

    //-----------------------------------------------------------------------------
    </script>
  • 相关阅读:
    Log4J输出日志到WEB工程目录的实现方法
    MyEclipse 10 中增加svn插件
    Web 项目添加log4j
    ruby on rails 之旅 第一章 ubuntu11.10安装
    ruby on rails 之旅 第一章 ubuntu12.04安装
    centos 6.3 server 安装mysql5
    技术实践第四期|解读移动开发者日常性能监控平台应用
    电脑一族预防颈椎劳损八法
    方便的使用单击和双击更新DataGrid中的数据的例子(转载)
    不重复随机数列生成算法
  • 原文地址:https://www.cnblogs.com/wf225/p/956663.html
Copyright © 2011-2022 走看看