这是从同事那里得来的代码,当然他也是从网上看来的。呵呵!整理了一下,这个方法绑定速度远远高于上一种(递归绑定)绑定树控件的方法。
下面是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;
}
}

}
下面是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
>
下面是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;
}
}
}
存储过程:
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
代码已经没有漏掉的了。希望能给大家一点帮助!
本文介绍了一种高效绑定树控件的方法,通过调用存储过程获取数据,并使用C#实现树状结构的动态填充。文章详细展示了从后台数据获取到前端展示的全过程。

1398

被折叠的 条评论
为什么被折叠?



