常德不忒,复归於无极

以学会友,学无止境

树型节点与数据库的动态连接(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>
        &nbsp;
    </div>
    <br/><br/>
        <asp:Label id="Message" runat="server"/>
    </form>
</body>
</html>

 

目前只是实现了数型节点的动态显示操作,插入节点和删除节点留待以后解决。

 

posted on 2008-10-22 22:17  无极剑  阅读(1444)  评论(0编辑  收藏  举报

导航