昨天花了半天的时间搞的, 其中碰到一个很郁闷的错误, 就是我写完运行, 程序不能无刷新调用服务器端方法. 调了1个多小时才发现原来忘记加<form runat="server">. 特郁闷啊....
需要先安装ajax.pro的补丁,不然会报"缺少对象"的错误,ajax.pro google下就有了.
下载地址: .NET+Ajax.Pro实现无刷新动态树
下载地址: CSS实现静态树
.NET+Ajax.Pro实现无刷新动态树代码:
客户端代码:DynamicTree.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DynamicTree.aspx.cs" Inherits="DynamicTree" %>
<!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 id="Head1" runat="server">
<title>无标题页</title>
<link type="text/css" href="Tree.css" rel="stylesheet" />
<script type="text/javascript">
var li_ClickingNode; // 用户点击的节点
var CategoryID = 0;
// 展开和折叠父节点
function ExpandCategory( objImg )
{
li_ClickingNode = objImg.parentNode; // 获得用户点击的节点
// 获得点击节点的ID
CategoryID = li_ClickingNode.id.substr( li_ClickingNode.id.indexOf( "_" ) + 1 );
if ( "Closed" == li_ClickingNode.className )
{
li_ClickingNode.className = "Opened";
switchNode( true ); // 显示 "请稍候,正在加载......"
// 调用服务器方法,获得该节点的子节点
DynamicTree.GetSubCategoryS( CategoryID, GetSubCategory_CallBack );
}
else if ( "Opened" == li_ClickingNode.className )
{
li_ClickingNode.className = "Closed";
// 当折叠父节点时删除显示的子节点
li_ClickingNode.removeChild( document.getElementById("ul_" + CategoryID) );
}
}
// 显示和隐藏 "请稍候,正在加载......"
function switchNode( show )
{
if ( show ) // 显示 "请稍候,正在加载......"
{
// 用户添加从数据库获得的子节点
var ul = document.createElement( "UL" );
ul.id = "ul_" + CategoryID;
var li = document.createElement( "LI" );
li.className = "Child"; // 表示该节点为父节点
// 创建节点前的图片
var img = document.createElement( "IMG" );
img.src = "";
// 创建超联接,功能和img一样
var a = document.createElement( "A" );
a.href = "javascript:void(0)";
a.innerHTML = "请稍候,正在加载......"; // 显示节点值
/* 添加子节点 */
li.appendChild( img );
li.appendChild( a );
ul.appendChild( li ); // 将子节点添加到ul中
li_ClickingNode.appendChild( ul );
}
else // 隐藏 "请稍候,正在加载......"
{
var ul = document.getElementById( "ul_" + CategoryID );
if ( ul )
{
li_ClickingNode.removeChild( ul );
}
}
}
function GetSubCategory_CallBack( response )
{
var ds = response.value;
if ( ds != null && typeof(ds) == "object" && ds.Tables[0] != null )
{
// 用户添加从数据库获得的子节点
var ul = document.createElement( "UL" );
ul.id = "ul_" + CategoryID;
// 遍历用户点击的父节点的子节点
for ( var i = 0; i < ds.Tables[0].Rows.length; i++ )
{
if ( 1 == ds.Tables[0].Rows[i].hasChild ) // 表示该子节点是有子节点
{
// 创建节点
var li = document.createElement( "LI" );
li.id = "li_" + ds.Tables[0].Rows[i].CategoryID;
li.className = "Closed"; // 表示该节点为父节点
// 创建节点前的图片
var img = document.createElement( "IMG" );
img.src = "";
img.alt = ds.Tables[0].Rows[i].CategoryName;
// 点击图片调用展开该父节点的函数
img.onclick = function() { ExpandCategory(this); };
// 创建超联接,功能和img一样
var a = document.createElement( "A" );
a.href = "javascript:ExpandCategory(this)";
a.innerHTML = ds.Tables[0].Rows[i].CategoryName; // 显示节点值
/* 添加子节点 */
li.appendChild( img );
li.appendChild( a );
ul.appendChild( li ); // 将子节点添加到ul中
}
else // 表示该节点无子节点
{
// 创建节点
var li = document.createElement( "LI" );
li.id = "li_" + ds.Tables[0].Rows[i].CategoryID;
li.className = "Child"; // 表示该节点为子节点
// 创建节点前的图片
var img = document.createElement( "IMG" );
img.src = "";
img.alt = ds.Tables[0].Rows[i].CategoryName;
// 创建超联接
var a = document.createElement( "A" );
a.href = "javascript:ShowMsg(this)";
a.innerHTML = ds.Tables[0].Rows[i].CategoryName; // 显示节点值
/* 添加子节点 */
li.appendChild( img );
li.appendChild( a );
ul.appendChild( li ); // 将子节点添加到ul中
}
} // End Of for ( var i = 0; i < ds.Tables[0].Rows.length; i++ )
switchNode( false ); // 隐藏 "请稍候,正在加载......"
// 将从数据库中获得的子节点添加到用户点击的父节点中
li_ClickingNode.appendChild( ul );
}// End Of if ( ds != null && typeof(ds) == "object" && ds.Tables[0] != null )
}
/* 添加根节点 */
function showRootNode()
{
li_ClickingNode = document.getElementById("Category");
DynamicTree.GetSubCategoryS( 0, GetSubCategory_CallBack );
}
function ShowMsg( objA )
{
alert( "子节点" );
}
</script>
</head>
<body onload="showRootNode()">
<form id="form1" runat="server">
<div id="Category">
<h4>DynamicTreeDemo</h4>
<ul id="CategoryTree">
<%--<li id="li_1" class="Closed"> <img src="" alt="我的文档" onclick="ExpandCategory( this )" /> <a href="javascript:void(0)"> 我的文档 </a> </li>--%>
</ul>
</div>
</form>
</body>
</html>
服务器端代码:DynamicTree.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;
using System.Data.Sql;
using System.Data.SqlClient;
public partial class DynamicTree : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
AjaxPro.Utility.RegisterTypeForAjax(typeof(DynamicTree));
}
[AjaxPro.AjaxMethod]
public string test(int nGategoryID)
{
return "abc" + nGategoryID.ToString();
}
[AjaxPro.AjaxMethod]
public DataSet GetSubCategoryS(int nGategoryID)
{
SqlConnection sqlCon = new SqlConnection("Server=127.0.0.1; uid=sa; pwd=sa; database=pubs");
SqlCommand sqlCmd = new SqlCommand();
SqlDataAdapter sqlDA = new SqlDataAdapter();
DataSet objDS = new DataSet();
string strSQL = "";
strSQL = "Select CategoryID, CategoryName, FatherID, dbo.isLeaf(CategoryID) As hasChild ";
strSQL += "From Tree Where FatherID = " + nGategoryID;
sqlCmd.CommandText = strSQL;
sqlCmd.Connection = sqlCon;
sqlDA.SelectCommand = sqlCmd;
try
{
sqlCon.Open();
sqlDA.Fill(objDS, "Tree");
return objDS;
}
catch (Exception ex)
{
Response.Write(ex.Message);
return objDS;
}
finally
{
sqlCon.Close();
}
}
}
CSS代码:Tree.css
a{ text-decoration:none }
a,a:visited{ color:#000000; background:inherit; }
body{ margin:0; padding:20px; font:12px tahoma, 宋体, sans-serif; }
h4{ margin:0; padding:0; font-size:18px; text-align:center; }
img{ cursor:hand; }
#Category
{
float:left; width:250px; border:1px solid #99BEEF;;
background:#D2E4FC; color:inherit; margin:3px; padding:3px;
}
#Category ul{ margin:0 0 0 10px; padding:2px 0 0 0; list-style:none; }
#Category li{ margin:0 0 0 10px; padding:2px 0 0 0; }
#Category .Opened{ }
#Category .Closed{ }
#Category .Child { }
#Category .Closed ul{ display:none; }
#Category .Opened img{ background:url(Image/Opened.gif); background-repeat:no-repeat; width:16px; height:16px; }
#Category .Closed img{ background:url(Image/Closed.gif); background-repeat:no-repeat; width:16px; height:16px; }
#Category .Child img{ background:url(Image/Child.gif); background-repeat:no-repeat; width:16px; height:16px; cursor:default; }
评论