树型节点与数据库的动态连接(asp.net 2.0 TreeView控件的使用)
在网上看了很多ASP.NET的学习资料,感觉ASP.NET不算太难。
一上手,才感到不是如此啊!想做一个TreeView动态链接数据库的小程序还真难。找了好几天,凑拼了几段程序,竟然通了,很有成就感。贴出来,不怕大家见笑。
现在SQL数据库中创建数据库和表:
CREATE DATABASE SampleDB
GO
USE SampleDB
GO
CREATE TABLE TreeCodes
( CodeId INT PRIMARY KEY, CodeName VARCHAR(40), CodeIdParent INT NOT NULL );
GO
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (0,'根节点',-1);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (1,'子节点1',0);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (2,'子节点2',0);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (3,'子节点3',0);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (4,'子节点4',0);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (5,'子节点5',0);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (6,'子节点11',1);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (7,'子节点12',1);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (8,'子节点13',1);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (9,'子节点14',1);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (10,'子节点21',2);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (11,'子节点22',2);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (12,'子节点31',3);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (13,'子节点32',3);
INSERT INTO TreeCodes ( CodeId, CodeName, CodeIdParent) VALUES (14,'子节点41',4);
GO
----------------------------------------------------------------
Microsoft Visual Studio 2005中的程序如下:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
' 页面PostBack时执行
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
PopulateRootLevel()
End If
End Sub
' 显示根节点 CodeId为0
Private Sub PopulateRootLevel()
Dim objConn As New SqlConnection("server=localhost;Trusted_Connection=true;DATABASE=SampleDB")
Dim objCommand As New SqlCommand("SELECT CodeId,CodeName ,(select count(*) FROM TreeCodes WHERE CodeIdParent=TC.CodeId) ChildNodeCount FROM Treecodes TC WHERE CodeId=0", objConn)
Dim da As New SqlDataAdapter(objCommand)
Dim dt As New DataTable()
da.Fill(dt)
PopulateNodes(dt, TreeView1.Nodes)
End Sub
' 填充并显示子节点
Private Sub PopulateNodes(ByVal dt As DataTable, ByVal nodes As TreeNodeCollection)
For Each dr As DataRow In dt.Rows
Dim tn As New TreeNode()
tn.Text = dr("CodeName").ToString()
tn.Value = dr("CodeId").ToString()
nodes.Add(tn)
' 如有子节点,则设置为可以展开
tn.PopulateOnDemand = (CInt(dr("ChildNodeCount")) > 0)
Next
End Sub
' 如节点的PopulateOnDemand 属性为true,则其在展开时发生本事件
Protected Sub TreeView1_TreeNodePopulate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodePopulate
PopulateSubLevel(CInt(e.Node.Value), e.Node)
End Sub
' 当TreeView设置为OnSelectedNodeChanged="Select_Change"时,单击节点时执行本子程序
Sub Select_Change(ByVal sender As Object, ByVal e As EventArgs)
Message.Text = "你选择的节点是: " & TreeView1.SelectedNode.Text
End Sub
' 单击父节点时填充并显示子节点
Private Sub PopulateSubLevel(ByVal parentid As Integer, ByVal parentNode As TreeNode)
Dim objConn As New SqlConnection("server=localhost;Trusted_Connection=true;DATABASE=SampleDB")
Dim objCommand As New SqlCommand("select CodeId,CodeName ,(select count(*) FROM TreeCodes WHERE CodeIdParent=TC.CodeId) ChildNodeCount FROM TreeCodes TC WHERE CodeIdParent=@parentID", objConn)
objCommand.Parameters.Add("@parentID", SqlDbType.Int).Value = parentid
Dim da As New SqlDataAdapter(objCommand)
Dim dt As New DataTable()
da.Fill(dt)
PopulateNodes(dt, parentNode.ChildNodes)
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>树型节点与数据库的动态连接(asp.net 2.0 TreeView控件的使用)</title>
</head>
<body>
<form id="form1" runat="server" enableviewstate="true">
<div>
<asp:TreeView ID="TreeView1" OnSelectedNodeChanged="Select_Change" runat="server" AutoGenerateDataBindings="False" ShowLines="True" ExpandDepth="0">
</asp:TreeView>
</div>
<br/><br/>
<asp:Label id="Message" runat="server"/>
</form>
</body>
</html>
目前只是实现了数型节点的动态显示操作,插入节点和删除节点留待以后解决。