这是从同事那里得来的代码,当然他也是从网上看来的。呵呵!整理了一下,这个方法绑定速度远远高于上一种(递归绑定)绑定树控件的方法。
下面是cs中的代码:
using system;
using system.data;
using system.configuration;
using system.collections;
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.sqlclient;
public partial class getdataprocedurecreatetree : system.web.ui.page {
dbhelpersql obj = new dbhelpersql();
protected void page_load(object sender, eventargs e)
...{
if (!ispostback)
...{
datatable dt = new datatable();
dt = getchindnode("0");//得到所有父节点,放到datatable中,这里默认根节点的父节点为 0
bindnode(dt, treeview1.nodes); //绑定所有的父节点
}
}
/** <summary>
/// 调用存储过程,得到父节点的子节点,放到datatable中
/// </summary>
/// <param name="parentid"></param>
/// <returns></returns>
private datatable getchindnode(string parentid)
...{
datatable dt = new datatable();
dt = obj.executesql1("treeviewgetdata",parentid);
return dt;
}
/** <summary>
/// 填充节点事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void treeview1_treenodepopulate(object sender, treenodeeventargs e)
...{
getdatanode(e.node.value, e.node); //点加号展开时调用.得到数据并绑定.传入点击结点id,和点击节点对像.
}
private void getdatanode(string parentid,treenode node)
...{
bindnode(getchindnode(parentid), node.childnodes); //向结点填充数据.
}
/** <summary>
/// 填充节点
/// </summary>
/// <param name="dt"></param>
/// <param name="node"></param>
private void bindnode(datatable dt ,treenodecollection node)
...{
dataview dv = new dataview(dt);
treenode newnode;
foreach (datarowview dr in dv)
...{
newnode = new treenode();
newnode.text = dr["nodename"].tostring();
newnode.value = dr["id"].tostring();
node.add(newnode);
//是否动态添加结点。
newnode.populateondemand = convert.toint32(dr["childnodecount"].tostring()) > 0;
}
}
}
using system.data;
using system.configuration;
using system.collections;
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.sqlclient;
public partial class getdataprocedurecreatetree : system.web.ui.page {
dbhelpersql obj = new dbhelpersql();
protected void page_load(object sender, eventargs e)
...{
if (!ispostback)
...{
datatable dt = new datatable();
dt = getchindnode("0");//得到所有父节点,放到datatable中,这里默认根节点的父节点为 0
bindnode(dt, treeview1.nodes); //绑定所有的父节点
}
}
/** <summary>
/// 调用存储过程,得到父节点的子节点,放到datatable中
/// </summary>
/// <param name="parentid"></param>
/// <returns></returns>
private datatable getchindnode(string parentid)
...{
datatable dt = new datatable();
dt = obj.executesql1("treeviewgetdata",parentid);
return dt;
}
/** <summary>
/// 填充节点事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void treeview1_treenodepopulate(object sender, treenodeeventargs e)
...{
getdatanode(e.node.value, e.node); //点加号展开时调用.得到数据并绑定.传入点击结点id,和点击节点对像.
}
private void getdatanode(string parentid,treenode node)
...{
bindnode(getchindnode(parentid), node.childnodes); //向结点填充数据.
}
/** <summary>
/// 填充节点
/// </summary>
/// <param name="dt"></param>
/// <param name="node"></param>
private void bindnode(datatable dt ,treenodecollection node)
...{
dataview dv = new dataview(dt);
treenode newnode;
foreach (datarowview dr in dv)
...{
newnode = new treenode();
newnode.text = dr["nodename"].tostring();
newnode.value = dr["id"].tostring();
node.add(newnode);
//是否动态添加结点。
newnode.populateondemand = convert.toint32(dr["childnodecount"].tostring()) > 0;
}
}
}
下面是aspx界面中的源:
<%@ page language="c#" autoeventwireup="true" codefile="getdataprocedurecreatetree.aspx.cs" inherits="getdataprocedurecreatetree" %>
<!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>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:treeview id="treeview1" runat="server" expanddepth="0"
ontreenodepopulate="treeview1_treenodepopulate" style="position: relative" imageset="simple" collapseimageurl="~/image/decrease.bmp" expandimageurl="~/image/add.bmp">
<parentnodestyle font-bold="false" />
<hovernodestyle font-underline="true" forecolor="#5555dd" />
<selectednodestyle font-underline="true" forecolor="#5555dd" horizontalpadding="0px"
verticalpadding="0px" />
<nodestyle font-names="tahoma" font-size="10pt" forecolor="black" horizontalpadding="5px"
nodespacing="0px" verticalpadding="2px" />
</asp:treeview>
</div>
</form>
</body>
</html>
<!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>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:treeview id="treeview1" runat="server" expanddepth="0"
ontreenodepopulate="treeview1_treenodepopulate" style="position: relative" imageset="simple" collapseimageurl="~/image/decrease.bmp" expandimageurl="~/image/add.bmp">
<parentnodestyle font-bold="false" />
<hovernodestyle font-underline="true" forecolor="#5555dd" />
<selectednodestyle font-underline="true" forecolor="#5555dd" horizontalpadding="0px"
verticalpadding="0px" />
<nodestyle font-names="tahoma" font-size="10pt" forecolor="black" horizontalpadding="5px"
nodespacing="0px" verticalpadding="2px" />
</asp:treeview>
</div>
</form>
</body>
</html>
下面是dbhelpersql.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.sqlclient;
/** <summary>
/// dbhelpersql 对数据库的各种操作。
/// </summary>
public class dbhelpersql //连接sqlserver数据库
...{
sqlconnection conn; //定义连接
public dbhelpersql()
...{
}
/** <summary>
/// 连字数据库
/// </summary>
public void connectdatabase()
...{
string connectionstring = configurationsettings.appsettings["connectionstring"];
conn = new sqlconnection(connectionstring);
conn.open();
}
/** <summary>
/// 执行存储过程返回datatable
/// </summary>
/// <param name="sql"></param>
/// <param name="parentid"></param>
/// <returns></returns>
public datatable executesql1(string sql, string parentid)
...{
datatable dt;
try
...{
connectdatabase();
dt = new datatable();
sqldataadapter da = new sqldataadapter(sql, conn);
sqlparameter parm = new sqlparameter("@parentid", parentid);
da.selectcommand.parameters.add(parm);
da.selectcommand.commandtype = commandtype.storedprocedure;
da.fill(dt);
conn.close();
return dt;
}
catch
...{
conn.close();
return dt = null;
}
}
}
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.sqlclient;
/** <summary>
/// dbhelpersql 对数据库的各种操作。
/// </summary>
public class dbhelpersql //连接sqlserver数据库
...{
sqlconnection conn; //定义连接
public dbhelpersql()
...{
}
/** <summary>
/// 连字数据库
/// </summary>
public void connectdatabase()
...{
string connectionstring = configurationsettings.appsettings["connectionstring"];
conn = new sqlconnection(connectionstring);
conn.open();
}
/** <summary>
/// 执行存储过程返回datatable
/// </summary>
/// <param name="sql"></param>
/// <param name="parentid"></param>
/// <returns></returns>
public datatable executesql1(string sql, string parentid)
...{
datatable dt;
try
...{
connectdatabase();
dt = new datatable();
sqldataadapter da = new sqldataadapter(sql, conn);
sqlparameter parm = new sqlparameter("@parentid", parentid);
da.selectcommand.parameters.add(parm);
da.selectcommand.commandtype = commandtype.storedprocedure;
da.fill(dt);
conn.close();
return dt;
}
catch
...{
conn.close();
return dt = null;
}
}
}
存储过程:
create procedure treeviewgetdata(
@parentid nvarchar(40)) --参数,父节点id
as
if @parentid is null --如果,父节点id为空
select [id],[nodename] ,(
select count(*) from ra_subjectstore where parentid=org.[id]) as childnodecount
from ra_subjectstore as org where @parentid is null
else
--查询出该父节点下第一级子节点
select [id],[nodename] ,(
select count(*) from ra_subjectstore where parentid=org.[id]) as childnodecount
from ra_subjectstore as org where parentid =@parentid
go
@parentid nvarchar(40)) --参数,父节点id
as
if @parentid is null --如果,父节点id为空
select [id],[nodename] ,(
select count(*) from ra_subjectstore where parentid=org.[id]) as childnodecount
from ra_subjectstore as org where @parentid is null
else
--查询出该父节点下第一级子节点
select [id],[nodename] ,(
select count(*) from ra_subjectstore where parentid=org.[id]) as childnodecount
from ra_subjectstore as org where parentid =@parentid
go
代码已