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