此代码是从网上下载的资源,后经过修改 
在此感谢原著作者

----------------------------web.config----------
    <httpHandlers>
      <add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro" />
    </httpHandlers>
--------------------------Tree.aspx

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Tree.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>Ajax Efficient Tree</title>
    
<link type="text/css" href="css/tree.css" rel="stylesheet">
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        
<asp:Panel ID="Panel1" runat="server" Height="300px" Width="100px">
            
<div id="CategoryTree" class="TreeMenu" style="width: 150px"></div>
        
</asp:Panel>
        
<script language="jscript">
            var tree 
= document.getElementById("CategoryTree");//获取上面那个div的id名称
            var root = document.createElement("li");
            root.id 
= "li_0";
            tree.appendChild( root );
            ExpandSubCategory( 
0 );
            function ExpandSubCategory( categoryID )
            
{
                var liFather 
= document.getElementById( "li_" + categoryID );
                
if( liFather.getElementsByTagName("li").length > 0)
                
{
                    ChangeStatus( categoryID );
                    
return;
                }

                liFather.className 
= "Opened";
                SwitchNode( categoryID, 
true );
                
                
//仅获取当前节点的子Nodes
                _Default.GetSubCategory( categoryID, GetSubCategory_callback );
            }
            
            function SwitchNode( CategoryID, show )
            
{
                var li_father 
= document.getElementById("li_" + CategoryID);
                
if( show )
                
{
                    var ul 
= document.createElement("ul");
                    ul.id 
= "ul_note_" + CategoryID;
                    
                    var note 
= document.createElement("li");
                    note.className 
= "Child";              
                    
                    var img 
= document.createElement("img");
                    img.className 
= "s";
                    img.src 
= "css/s.gif";                    
                    
                    var a 
= document.createElement("a");
                    a.href 
= "javascript:void(0);";
                    a.innerHTML 
= "Please waiting...";
                    
                    note.appendChild(img);
                    note.appendChild(a);
                    ul.appendChild(note);
                    li_father.appendChild(ul);                                        
                }
   
                
else
                
{
                    var ul 
= document.getElementById("ul_note_" + CategoryID );
                    
if( ul )
                    
{
                        li_father.removeChild(ul);
                    }

                }
             
            }

            function GetSubCategory_callback( response )
            
{
               var dt 
= response.value.Tables[0];
               
if( dt.Rows.length > 0 )
               
{
                    var iCategoryID 
= dt.Rows[0].FatherID;               
               }
                                
               var li_father 
= document.getElementById("li_" + iCategoryID );
               var ul 
= document.createElement("ul");
               
for( var i = 0; i < dt.Rows.length; i++ )
               
{
                    
if( dt.Rows[i].IsChild == 1 )
                    
{
                        var li 
= document.createElement("li");
                        li.className 
= "Child";
                        li.id 
= "li_" + dt.Rows[i].CategoryID;
                        var img 
= document.createElement("img");
                        img.id 
= dt.Rows[i].CategoryID;
                        img.className 
= "s";
                        img.src 
= "css/s.gif";
                        var a 
= document.createElement("a");
                        a.href 
= "javascript:OpenDocument('" + dt.Rows[i].CategoryID + "');";
                        a.innerHTML 
= dt.Rows[i].CategoryName;                                          
                    }

                    
else
                    
{
                        var li 
= document.createElement("li");
                        li.className 
= "Closed";
                        li.id 
= "li_" + dt.Rows[i].CategoryID;
                        var img 
= document.createElement("img");
                        img.id 
= dt.Rows[i].CategoryID;
                        img.className 
= "s";
                        img.src 
= "css/s.gif";
                        img.onclick 
= function(){ ExpandSubCategory( this.id ); };
                        img.alt 
= "Expand/collapse";
                        var a 
= document.createElement("a");
                        a.href 
= "javascript:ExpandSubCategory('" + dt.Rows[i].CategoryID + "');";
                        a.innerHTML 
= dt.Rows[i].CategoryName;                                         
                    }

                    li.appendChild(img);
                    li.appendChild(a);
                    ul.appendChild(li);
               }

               li_father.appendChild(ul);
               SwitchNode( iCategoryID, 
false );
            }
          
            
            
//单击叶节点时, 异步从服务端获取单个节点的数据.
            function OpenDocument( CategoryID )
            
{                
                _Default.GetNameByCategoryID( CategoryID, GetNameByCategoryID_callback );
            }

            
            function GetNameByCategoryID_callback( response )
            
{
                
//alert( response.value );
                
//location.href="http://www.sohu.com";此处作了修改, 能跳转到frameset的主页面
                if(response.value=="修改密码")
                 window.open(
"http://www.sohu.com","main");
                 
else if(response.value=="钢笔")
                 window.open(
"http://www.baidu.com","main");
            }

            
            function ChangeStatus( CategoryID )
            
{
                var li_father 
= document.getElementById("li_" + CategoryID );
                
if( li_father.className == "Closed" )
                
{
                    li_father.className 
= "Opened";
                }

                
else
                
{
                    li_father.className 
= "Closed";
                }

           }
              
        
</script>          
    
</div>
    
</form>    
</body>      
</html>


--------------------Tree.aspx.cs------------

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
   
//此对象用于存放所有的节点数
   public static DataSet dsAllNodes = new DataSet();

   
protected void Page_Load(object sender, EventArgs e)
   
{
       AjaxPro.Utility.RegisterTypeForAjax(
typeof(_Default));       
       CreateNodes();
   }


   
private DataTable CreateStructure()
   
{
      DataTable dt 
= new DataTable();
      dt.Columns.Add(
new DataColumn("CategoryID"typeof(int)));
      dt.Columns.Add(
new DataColumn("CategoryName"typeof(string)));
      dt.Columns.Add(
new DataColumn("FatherID"typeof(string)));
      dt.Columns.Add(
new DataColumn("IsChild"typeof(bool)));
      
return dt;
   }

   
public void CreateNodes()
   
{
      DataTable dt 
= this.CreateStructure();

      DataRow drNew 
= dt.NewRow();
      drNew[
"CategoryID"= 1;
      drNew[
"CategoryName"= "帐户管理";
      drNew[
"FatherID"= 0;
      dt.Rows.Add( drNew );

      drNew 
= dt.NewRow();
      drNew[
"CategoryID"= 2;
      drNew[
"CategoryName"= "修改密码";
      drNew[
"FatherID"= 1;
      dt.Rows.Add( drNew );

      drNew 
= dt.NewRow();
      drNew[
"CategoryID"= 3;
      drNew[
"CategoryName"= "工具";
      drNew[
"FatherID"= 1;
      dt.Rows.Add( drNew );

      drNew 
= dt.NewRow();
      drNew[
"CategoryID"= 4;
      drNew[
"CategoryName"= "手机";
      drNew[
"FatherID"= 0;
      dt.Rows.Add(drNew);

      drNew 
= dt.NewRow();
      drNew[
"CategoryID"= 5;
      drNew[
"CategoryName"= "苹果";
      drNew[
"FatherID"= 4;
      dt.Rows.Add( drNew );

      drNew 
= dt.NewRow();
      drNew[
"CategoryID"= 9;
      drNew[
"CategoryName"= "钢笔";
      drNew[
"FatherID"= 3;
      dt.Rows.Add( drNew );

      drNew 
= dt.NewRow();
      drNew[
"CategoryID"= 10;
      drNew[
"CategoryName"= "铅笔";
      drNew[
"FatherID"= 3;
      dt.Rows.Add( drNew );

      drNew 
= dt.NewRow();
      drNew[
"CategoryID"= 14;
      drNew[
"CategoryName"= "尺子";
      drNew[
"FatherID"= 3;
      dt.Rows.Add( drNew );
      
      drNew 
= dt.NewRow();
      drNew[
"CategoryID"= 12;
      drNew[
"CategoryName"= "橡皮";
      drNew[
"FatherID"= 3;
      dt.Rows.Add( drNew );

      dsAllNodes.Tables.Add(dt);
   }


   [AjaxPro.AjaxMethod]
   
public DataSet GetSubCategory(int CategoryID)
   
{
      DataSet ds 
= new DataSet();
      DataTable dt 
= this.CreateStructure();
      DataRow[] drSelect 
= dsAllNodes.Tables[0].Select("FatherID=" + CategoryID.ToString());
      
foreach (DataRow drTemp in drSelect)
      
{
         DataRow dr 
= dt.NewRow();
         dr[
"CategoryID"= drTemp["CategoryID"];
         dr[
"CategoryName"= drTemp["CategoryName"];
         dr[
"FatherID"= drTemp["FatherID"];
         dr[
"IsChild"= IsLeaf( int.Parse( drTemp["CategoryID"].ToString() ) );
         dt.Rows.Add(dr);
      }

      ds.Tables.Add(dt);
      
return ds;
   }


   [AjaxPro.AjaxMethod]
   
public bool IsLeaf(int Category)
   
{
       
foreach(DataRow dr in dsAllNodes.Tables[0].Rows)
       
{
          
if (dr["FatherID"!= null && int.Parse(dr["FatherID"].ToString()) == Category)
          
{
             
return false;  
          }

       }

       
return true;
   }


   [AjaxPro.AjaxMethod]
   
public string GetNameByCategoryID(string CategoryID )
   
{
      
foreach( DataRow dr in dsAllNodes.Tables[0].Rows )
      
{
         
if( dr["CategoryID"].ToString() == CategoryID.ToString() )
         
{
            
return dr["CategoryName"].ToString();
         }

      }

      
return "";
   }

}

修改的地方:原程序只有一个父结点,现在我改成两个了,另外,在点击子结点的时候,我做了两个连接跳转到搜狐和百度。

另外,还需要一个css文件夹,此处好像不能上传文件,抱歉了。还有一点,系统目录的bin文件夹里要有ajaxpro.dll这个文件。网上有下载的。希望对大家有所帮助。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1504549