注:TreeView.TreeNodePopulate 事件
若要动态填充某个节点,请首先将该节点的 PopulateOnDemand 属性设置为 true 。然后,为以编程方式填充节点的 TreeNodePopulate 事件定义一个事件处理方法。通常的事件处理方法会从数据源中检索节点数据,将该数据放入一个节点结构中,然后将该节点结构添加到正在被填充的节点的 ChildNodes 集合中。通过将 TreeNode 对象添加到父节点的 ChildNodes 集合中,可以创建一个节点结构。
当节点的 PopulateOnDemand 属性设置为 true 时,必须动态填充该节点。不能以声明方式将另一节点嵌套在它的下面;否则将会在页面上出现一个错误!
例子:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
void PopulateNode(Object sender, TreeNodeEventArgs e)
{
// 判断节点深度
switch(e.Node.Depth)
{
case 0:
// 产生第一层节点
PopulateCategories(e.Node);
break;
case 1:
//产生第二层节点
PopulateProducts(e.Node);
break;
default:
// Do nothing.
break;
}
}
void PopulateCategories(TreeNode node)
{
DataSet ResultSet = RunQuery("Select CategoryID, CategoryName From Categories");
// 建立第二层节点.
if(ResultSet.Tables.Count > 0)
{
//
// 从dataset中取值.
foreach (DataRow row in ResultSet.Tables[0].Rows)
{
// 建立新节点.
TreeNode NewNode = new TreeNode(row["CategoryName"].ToString(), row["CategoryID"].ToString());
// 设置 PopulateOnDemand 属性为true,以便下一层节点动态增加.
NewNode.PopulateOnDemand = true;
// 设置节点选中时展开
NewNode.SelectAction = TreeNodeSelectAction.Expand;
// 加入新节点.
node.ChildNodes.Add(NewNode);
}
}
}
void PopulateProducts(TreeNode node)
{
.
DataSet ResultSet = RunQuery("Select ProductName From Products Where CategoryID=" + node.Value);
if(ResultSet.Tables.Count > 0)
{
foreach (DataRow row in ResultSet.Tables[0].Rows)
{
// 建立新节点.
TreeNode NewNode = new TreeNode(row["ProductName"].ToString());
// 设置 PopulateOnDemand 属性false,关闭动态增加.
NewNode.PopulateOnDemand = false;
// 设置节点选中时什么也不做^-^.
NewNode.SelectAction = TreeNodeSelectAction.None;
// 加入新节点.
node.ChildNodes.Add(NewNode);
}
}
}
DataSet RunQuery(String QueryString)
{
// 建立数据库连接
String ConnectionString = "server=localhost;database=NorthWind;Integrated Security=SSPI";
SqlConnection DBConnection = new SqlConnection(ConnectionString);
SqlDataAdapter DBAdapter;
DataSet ResultsDataSet = new DataSet();
try
{
// 建立DataSet.
DBAdapter = new SqlDataAdapter(QueryString, DBConnection);
DBAdapter.Fill(ResultsDataSet);
// 关闭连接.
DBConnection.Close();
}
catch(Exception ex)
{
//
if(DBConnection.State == ConnectionState.Open)
{
DBConnection.Close();
}
Message.Text = "Unable to connect to the database.";
}
return ResultsDataSet;
}
</script>
<html>
<body>
<form runat="server">
<h3>TreeView TreeNodePopulate Example</h3>
<asp:TreeView id="LinksTreeView"
Font-Name= "Arial"
ForeColor="Blue"
EnableClientScript="false"
OnTreeNodePopulate="PopulateNode"
runat="server">
<Nodes>
<asp:TreeNode Text="Inventory"
SelectAction="Expand"
PopulateOnDemand="true"/>
</Nodes>
</asp:TreeView>
<br><br>
<asp:Label id="Message" runat="server"/>
</form>
</body>
</html>