Dropdownlist绑定树形数据库,Tree动态绑定数据库,动态增加节点,动态删除节点

本文介绍了一个 ASP.NET 应用中树视图控件的实现方式,包括节点的动态添加与删除功能。重点解决了删除父节点时同步删除其子节点的问题,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前台:

 

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MainMasterPage.master.cs" Inherits="Default_MainMasterPage" %>

<!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>Untitled Page</title>
</head>
<body style="margin:0">
    
<form id="form1" runat="server">
    
<div >
        
<table style="width: 100%; height: 100%">
            
<tr style="background-color:Gray">
                
<td colspan="2" style="height: 80px; background-color: #cccccc;" >
                    页眉
                
</td>
            
</tr>
            
<tr>
                
<td style="width: 160px; background-color:Silver" valign="top">
                    
<asp:TreeView ID="TreeLeft" runat="server" ShowLines="True">
                    
</asp:TreeView>
                
</td>
                
<td rowspan="2">
                   
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
                    
</asp:ContentPlaceHolder>
                
</td>
            
</tr>
            
<tr>
                
<td style="width: 160px; background-color: silver" valign="top">
                    Select ParentNode:
<br />
                    
<asp:DropDownList ID="ddlParentID" runat="server">
                    
</asp:DropDownList><br />
                    Text:
<asp:TextBox ID="txtNodeName" runat="server"></asp:TextBox><br />
                    
&nbsp;<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
                    
<asp:Button ID="btnDelete" runat="server" Text="Delete" OnClick="btnDelete_Click" /></td>
            
</tr>
        
</table>
       
</div>
    
</form>
</body>
</html>

后台:

 

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 Master_MasterPage : System.Web.UI.MasterPage
{
    
protected string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
    
protected void Page_Load(object sender, EventArgs e)
    {
        
if (!IsPostBack)
        {
            TreeleftBind();
            bindGroup();
        }
    }
    
#region 绑定树
    
private void TreeleftBind()
    {
        
this.TreeLeft.Nodes.Clear();
        DataTable dt 
= GetTable();
        DataView dv 
= new DataView(dt);
        dv.RowFilter 
= "TreeParentID = 0";
        TreeNode node 
= new TreeNode();
        
foreach (DataRowView drv in dv)
        {
            node.Text 
= drv["TreeName"].ToString();
            node.Value 
= drv["ID"].ToString();
            node.Expanded 
= true;
            
this.TreeLeft.Nodes.Add(node);
            AddReplies(dt, node);
        }
    }
    
private void AddReplies(DataTable dt, TreeNode node)
    {

        DataView dv 
= new DataView(dt);
        
        dv.RowFilter 
= "TreeParentID='" + node.Value + "'";
        
foreach (DataRowView row in dv)
        {
            TreeNode replyNode 
= new TreeNode();
            replyNode.Text 
= row["TreeName"].ToString();
            replyNode.Value 
= row["ID"].ToString();
            replyNode.NavigateUrl 
= row["Link"].ToString();
            replyNode.Expanded 
= false;
            node.ChildNodes.Add(replyNode);
            replyNode.ShowCheckBox 
= true;
            
            AddReplies(dt, replyNode);
        }

    }
    
private DataTable GetTable()
    {
        SqlConnection con 
= new SqlConnection(ConnectionString);
        
string strSQL = "select * from AutoTree";
        SqlDataAdapter da 
= new SqlDataAdapter(strSQL, con);
        DataTable dt 
= new DataTable();
        da.Fill(dt);
        
return dt;
    }
    
#endregion

    
#region 绑定DropDownList
    
private void bindGroup()
    {
        
this.ddlParentID.Items.Clear();
        DataTable dt 
= GetTable(); //获取所有节点
        if (dt.Rows.Count > 0)
        {
            
foreach (DataRow row in dt.Rows)
            {
                
if (row["TreeParentID"].ToString().Trim() == "0")//绑定根节点
                {
                    
this.ddlParentID.Items.Add(new ListItem(row["TreeName"].ToString(), row["Id"].ToString()));
                    
this.bindDropChildItem(this.ddlParentID, dt, row["ID"].ToString(), 1);
                }
            }
        }
    }
    
private void bindDropChildItem(DropDownList d, DataTable dt, string id, int length)
    {
        DataRow[] rows 
= dt.Select("TreeParentID='" + id + "'""Id ASC");//取出id子节点进行绑定
        for (int i = 0; i < rows.Length; i++)
        {
            
this.ddlParentID.Items.Add(new ListItem(this.SpaceLength(length) + rows[i]["TreeName"].ToString(), rows[i]["Id"].ToString()));
            
this.bindDropChildItem(d, dt, rows[i]["Id"].ToString(), length + 1);//空白数目加1
        }
    }
    
private string SpaceLength(int i)
    {
        
string space = "";
        
for (int j = 0; j < i; j++)
        {
            space 
+= "--";
        }
        
return space;
    }
    
#endregion

    
#region 动态增加节点
    
protected void btnSubmit_Click(object sender, EventArgs e)
    {
        
string rootID = ddlParentID.SelectedValue.ToString();
        
string txtName = this.txtNodeName.Text;
        
using (SqlConnection Conn = new SqlConnection(ConnectionString))
        {
            SqlCommand cmd 
= new SqlCommand("insert into AutoTree (TreeName,TreeParentID) values (@TreeName,@TreeParentID)", Conn);
            cmd.Parameters.Add(
"@TreeName", SqlDbType.NVarChar, 50).Value = txtName;
            cmd.Parameters.Add(
"@TreeParentID", SqlDbType.NVarChar, 50).Value = rootID;
            Conn.Open();
            cmd.ExecuteNonQuery();
            
this.txtNodeName.Text = "";
        }
        TreeleftBind();
        bindGroup();
    }
    
#endregion

    
#region 动态删除节点
    
protected void btnDelete_Click(object sender, EventArgs e)
    {
        
if (TreeChecked() != 0)
        {
            
string strjavascript = "<script language='javascript'>alert('You cant delete the node which have childnode!')</script>";
            Page.ClientScript.RegisterStartupScript(
this.GetType(), "onclick", strjavascript);
        }
        
else
        {
            
foreach (TreeNode node in TreeLeft.CheckedNodes)
            {

                
string SelectTreeID = node.Value;
                
string strDelete = String.Format("delete from AutoTree where ID='{0}'", SelectTreeID);
                GetDB getDB 
= new GetDB();
                getDB.cmdExecute(strDelete);
            }
            TreeleftBind();
            bindGroup();
        }
    }
    
protected int TreeChecked()
    {
        
int count = 0;
        
foreach (TreeNode node in this.TreeLeft.CheckedNodes)
        {
            
if (node.ChildNodes.Count > 0)
            {
                count 
= count + 1;
            }
        }
        
return count;
    }
    
#endregion
    
protected void TreeLeft_SelectedNodeChanged(object sender, EventArgs e)
    {
        TreeNode node 
= TreeLeft.SelectedNode;
        
if (node.ChildNodes.Count != 0)
        {
            node.SelectAction 
= TreeNodeSelectAction.Expand;
            node.Expanded 
= true;
        }
        
else
        {
            Response.Redirect(
"@" + node.NavigateUrl);//数据库中LINK字段的数据为:~/WOW/Moniqi.aspx
            
        }
    }
}


现在遗留的问题是:删除时如果选择了父级节点而不选该父节点下的子节点,那在提交删除后,该父节点是删除了,但是数据库里该父节点下的子节点并没有删除。现在要做的就是如何在删除父节点的同时删除该节点下的子节点。(现在加了个判断,如果节点下有子节点,将提示不能删除,至于如何选中父节点时也选中子节点,还没整出来)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值