using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.OleDb; using System.Xml; using System.Text; namespace tree { /**//// <summary> /// TABLE [tree] /// COLUMN [treeid] INT IDENTITY /// COLUMN [treetitle] VARCHAR /// COLUMN [treenode] VARCHAR /// </summary> public class tree : System.Web.UI.Page { protected System.Web.UI.WebControls.Button btnDelete; protected System.Web.UI.WebControls.Button btnUpdate; protected System.Web.UI.WebControls.Button btnAdd; protected System.Web.UI.WebControls.Label lblTreeTitle; protected System.Web.UI.WebControls.TextBox txtAddTree; protected System.Web.UI.WebControls.TextBox txtUpdateTree; protected System.Web.UI.HtmlControls.HtmlInputHidden hidTreeid; protected System.Web.UI.WebControls.Label lblTree; protected System.Web.UI.WebControls.Label lblPrompt; protected System.Web.UI.WebControls.RequiredFieldValidator reqValAddTree; protected System.Web.UI.WebControls.LinkButton lbMakeXml; protected OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + HttpContext.Current.Server.MapPath("tree.mdb")); private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { int treeid = 0; if(Request.QueryString["treeid"] != null) { try { treeid = int.Parse(Request.QueryString["treeid"]); } catch { treeid = 0; } } if(treeid == 0) { lblTreeTitle.Text = "树根"; hidTreeid.Value = "0"; txtUpdateTree.Enabled = false; btnUpdate.Enabled = false; btnDelete.Enabled = false; } else { string sqlStr = "SELECT treetitle, treenode FROM tree WHERE treeid = " + treeid.ToString(); OleDbCommand cmd = new OleDbCommand(sqlStr, conn); conn.Open(); OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleRow); if(dr.Read()) { lblTreeTitle.Text = dr["treetitle"].ToString(); txtUpdateTree.Text = dr["treetitle"].ToString(); hidTreeid.Value = treeid.ToString(); } dr.Close(); conn.Close(); } if(Application["tree"] == null) { treeBuild(); } else { lblTree.Visible = true; lblTree.Text = Application["tree"].ToString(); } } } private void treeBuild() { string sqlStr = "SELECT * FROM tree ORDER BY treenode"; OleDbDataAdapter da = new OleDbDataAdapter(sqlStr, conn); DataTable dt = new DataTable(); da.Fill(dt); da.Dispose(); int treeLevel; char nodeChar; string treeNode; StringBuilder treeStr = new StringBuilder(""); for(int i = 0; i < dt.Rows.Count; i++) { treeNode = dt.Rows[i]["treenode"].ToString(); treeLevel = charCount(treeNode, ','); if(treeLevel == 0) { nodeChar = '┼'; } else { nodeChar = '─'; } treeStr.Append("<TABLE cellspacing="1" cellpadding="0" border="0" width="100%"> <TR> "); treeStr.Append("<TD align="right" width="" + (12 + treeLevel * 12) + "">" + nodeChar + "</TD> "); treeStr.Append("<TD><A href="tree.aspx?treeid=" + dt.Rows[i]["treeid"] + "" title="" + treeNode + "">"); treeStr.Append(dt.Rows[i]["treetitle"] + "</A></TD> </TR> </TABLE> "); } if(treeStr.Length > 0) { Application.Lock(); Application["tree"] = treeStr.ToString(); Application.UnLock(); lblTree.Visible = true; lblTree.Text = treeStr.ToString(); } } private void initTree() { lblTreeTitle.Text = "树根"; hidTreeid.Value = "0"; txtUpdateTree.Enabled = false; btnUpdate.Enabled = false; btnDelete.Enabled = false; Application.Remove("tree"); treeBuild(); } private void makeXml(string xmlPath) { string sqlStr = "SELECT * FROM tree ORDER BY treenode"; OleDbDataAdapter da = new OleDbDataAdapter(sqlStr, conn); DataTable dt = new DataTable(); da.Fill(dt); da.Dispose(); int ptreeDepth = -1; int treeDepth = 0; XmlTextWriter xw = new XmlTextWriter(xmlPath, null); xw.Formatting = Formatting.Indented; xw.IndentChar = ' '; xw.Indentation = 1; xw.WriteStartDocument(); xw.WriteStartElement("treeRoot"); foreach(DataRow dr in dt.Rows) { treeDepth = charCount(dr["treenode"].ToString(), ','); if(treeDepth == ptreeDepth) { xw.WriteEndElement(); xw.WriteStartElement("treeBranch"); } else if(treeDepth == ptreeDepth + 1) { xw.WriteStartElement("treeBranch"); } else { for(int i = 0; i < ptreeDepth - treeDepth; i++) { xw.WriteEndElement(); } xw.WriteEndElement(); xw.WriteStartElement("treeBranch"); } xw.WriteAttributeString("treeid", dr["treeid"].ToString()); xw.WriteAttributeString("treeNode", dr["treenode"].ToString()); xw.WriteElementString("treeTitle", dr["treetitle"].ToString()); ptreeDepth = treeDepth; } for(int i = 0; i < treeDepth; i++) { xw.WriteEndElement(); } xw.WriteEndElement(); xw.WriteEndElement(); xw.Flush(); xw.Close(); } private int charCount(string theString, char theChar) { int charCount = 0; char[] charArray = theString.ToCharArray(); for(int i = 0; i < charArray.Length; i++) { if(charArray[i] == theChar) { charCount++; } } return charCount; } Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /**//// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); this.btnUpdate.Click += new System.EventHandler(this.btnUpdate_Click); this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click); this.lbMakeXml.Click += new System.EventHandler(this.lbMakeXml_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void btnAdd_Click(object sender, System.EventArgs e) { int treeid = int.Parse(hidTreeid.Value); int nodeSerial; string treeTitle = txtAddTree.Text; string treeNode; string sqlStr; OleDbCommand cmd = new OleDbCommand(); cmd.Connection = conn; if(treeid == 0) { sqlStr = "SELECT TOP 1 treenode FROM tree WHERE treenode LIKE '___' ORDER BY treenode DESC"; cmd.CommandText = sqlStr; conn.Open(); object objTreeNode = cmd.ExecuteScalar(); conn.Close(); nodeSerial = ((objTreeNode == null) ? 0 : int.Parse(objTreeNode.ToString())) + 1; treeNode = nodeSerial.ToString("D3"); } else { sqlStr = "SELECT treenode FROM tree WHERE treeid = " + treeid.ToString(); cmd.CommandText = sqlStr; conn.Open(); string parentTreeNode = cmd.ExecuteScalar().ToString(); conn.Close(); sqlStr = "SELECT TOP 1 treenode FROM tree WHERE treenode LIKE '" + parentTreeNode + ",___' ORDER BY treenode DESC"; cmd.CommandText = sqlStr; conn.Open(); OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleRow); if(dr.Read()) { string brotherTree = dr[0].ToString(); nodeSerial = int.Parse(brotherTree.Substring(brotherTree.LastIndexOf(',') + 1, 3)) + 1; } else { nodeSerial = 1; } dr.Close(); conn.Close(); treeNode = parentTreeNode + "," + nodeSerial.ToString("D3"); } sqlStr = "INSERT INTO tree(treetitle, treenode) VALUES(@treetitle, @treenode)"; cmd.CommandText = sqlStr; cmd.Parameters.Add("@treetitle", OleDbType.VarChar, 50); cmd.Parameters.Add("@treenode", OleDbType.VarChar, 243); cmd.Parameters["@treetitle"].Value = treeTitle; cmd.Parameters["@treenode"].Value = treeNode; conn.Open(); int rowAffected = cmd.ExecuteNonQuery(); conn.Close(); if(rowAffected > 0) { lblPrompt.Text = "树枝 " + treeTitle + " 添加成功"; initTree(); } else { lblPrompt.Text = "树枝 " + treeTitle + " 添加失败"; } } private void btnUpdate_Click(object sender, System.EventArgs e) { int treeid = int.Parse(hidTreeid.Value); string treeTitle = Request.Form["txtUpdateTree"]; string sqlStr = "UPDATE tree SET treetitle = @treetitle WHERE treeid = " + treeid.ToString(); OleDbCommand cmd = new OleDbCommand(sqlStr, conn); cmd.Parameters.Add("@treetitle", OleDbType.VarChar, 50); cmd.Parameters["@treetitle"].Value = treeTitle; conn.Open(); int rowAffected = cmd.ExecuteNonQuery(); conn.Close(); if(rowAffected > 0) { lblPrompt.Text = "树枝 " + treeTitle + " 更新成功"; initTree(); } else { lblPrompt.Text = "树枝 " + treeTitle + " 更新失败"; } } private void btnDelete_Click(object sender, System.EventArgs e) { int treeid = int.Parse(hidTreeid.Value); string sqlStr = "SELECT treenode FROM tree WHERE treeid = " + treeid.ToString(); OleDbCommand cmd = new OleDbCommand(sqlStr, conn); conn.Open(); string treeNode = cmd.ExecuteScalar().ToString(); sqlStr = "DELETE FROM tree WHERE treeid = " + treeid.ToString() + " OR treenode LIKE '" + treeNode + "%'"; cmd.CommandText = sqlStr; int rowAffected = cmd.ExecuteNonQuery(); conn.Close(); if(rowAffected > 0) { lblPrompt.Text = "删除成功"; initTree(); } else { lblPrompt.Text = "删除失败"; } } private void lbMakeXml_Click(object sender, System.EventArgs e) { makeXml(Server.MapPath("tree.xml")); } }}