這幾天上班沒事作,也很差打醬油,學點沒接觸過的新東西吧,基本瞭解了下TreeView控件。javascript
TreeView 控件用於在樹結構中顯示分層數據,例如目錄或文件目錄等。html
下面看代碼吧:java
1.效果圖node
2.靜態數據方式(即在頁面上使用標籤<asp:TreeNode>)web
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TreeViewTest.aspx.cs" Inherits="Yc_TestS.TreeViewTest" %> <!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>TreeView</title> </head> <body> <form id="form1" runat="server"> <div> <asp:TreeView ID="treeT" runat="server"> <Nodes> <asp:TreeNode NavigateUrl="#" Text="城市" Expanded="True"> <asp:TreeNode NavigateUrl="#" Text="北京市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="上海市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="天津市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="重慶市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="湖北省"> <asp:TreeNode NavigateUrl="#" Text="武漢市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="黃岡市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="荊州市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="武穴市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="十堰市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="黃石市"></asp:TreeNode> </asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="河北省"> <asp:TreeNode NavigateUrl="#" Text="石家莊市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="唐山市"></asp:TreeNode> </asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="山西省"> <asp:TreeNode NavigateUrl="#" Text="太原市"></asp:TreeNode> <asp:TreeNode NavigateUrl="#" Text="大同市"></asp:TreeNode> </asp:TreeNode> </asp:TreeNode> </Nodes> </asp:TreeView> </div> </form> </body> </html>
3.前臺數據源綁定方式sql
a.xml數據數據庫
<?xml version="1.0" encoding="utf-8" ?> <Area iAreaID ="0" cAreaName="城市"> <Province iAreaID ="1" cAreaName="北京市"/> <Province iAreaID ="2" cAreaName="上海市"/> <Province iAreaID ="3" cAreaName="天津市"/> <Province iAreaID ="4" cAreaName="重慶市"/> <Province iAreaID ="5" cAreaName="湖北省"> <City iAreaID ="51" cAreaName="武漢市"/> <City iAreaID ="52" cAreaName="黃岡市" /> <City iAreaID ="53" cAreaName="荊州市"/> <City iAreaID ="54" cAreaName="武穴市" /> <City iAreaID ="55" cAreaName="十堰市"/> <City iAreaID ="56" cAreaName="黃石市" /> </Province> <Province iAreaID ="6" cAreaName="河北省"> <City iAreaID ="61" cAreaName="石家莊市"/> <City iAreaID ="62" cAreaName="唐山市" /> </Province> <Province iAreaID ="7" cAreaName="山西省"> <City iAreaID ="71" cAreaName="太原市" /> <City iAreaID ="72" cAreaName="大同市" /> </Province> </Area>
b.前臺頁面(這裏綁定了Xml的數據源)app
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TreeViewTest.aspx.cs" Inherits="Yc_TestS.TreeViewTest" %> <!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>TreeView</title> </head> <body> <form id="form1" runat="server"> <div> <%--TreeView控件的DataSourceID屬性指定數據源控件源ID。--%> <asp:TreeView ID="treeT" runat="server" DataSourceID="XmlDataSource1"> </asp:TreeView> <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/Xml/Area.xml"> </asp:XmlDataSource> </div> </form> </body> </html>
c.後臺代碼ide
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Security; using System.Data; using Yc_TestS.BaseClass; namespace Yc_TestS { public partial class TreeViewTest : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { /** * TreeNodeBinding類在TreeView控件中定義數據項與該數據項綁定到的節點之間的關係。 * 該類的DataMember屬性指定在節點顯示的數據源對應XML的節點。 * ValueField屬性對應TreeNode對象的Value屬性。 * TreeNodeBinding類的Text屬性指定向用戶顯示的文本, 若是該屬性沒有指定,則默認與ValueField屬性相同。 * */ this.treeT.ShowLines = false;//顯示鏈接子節點和父節點之間的線條 TreeNodeBinding Area = new TreeNodeBinding(); Area.DataMember = "Area";//指定綁定的成員 Area.ValueField = "cAreaName";//取值的字段 this.treeT.DataBindings.Add(Area); TreeNodeBinding Province = new TreeNodeBinding(); Province.DataMember = "Province";//添加與"省份"綁定 Province.ValueField = "cAreaName"; this.treeT.DataBindings.Add(Province); TreeNodeBinding City = new TreeNodeBinding(); City.DataMember = "City";//添加與"城市"綁定 City.ValueField = "cAreaName"; this.treeT.DataBindings.Add(City); } } }
4.後臺數據庫數據填充方式ui
a.數據庫數據
b.前臺頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TreeViewTest.aspx.cs" Inherits="Yc_TestS.TreeViewTest" %> <!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>TreeView</title> <script type="text/javascript"> function show(msg) { alert(msg); } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:TreeView ID="treeT" runat="server"> </asp:TreeView> </div> </form> </body> </html>
c.後臺代碼
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Security; using System.Data; using Yc_TestS.BaseClass; namespace Yc_TestS { public partial class TreeViewTest : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { AddTree(0, null); } private void AddTree(int Pid, TreeNode PNode) { string sqlStr = "SELECT Item_id,Item_name,Parent_ID FROM Para_item"; DataTable dt = YSqlHelper.ExecuteQuery(sqlStr, CommandType.Text); if (dt.Rows.Count > 0) { DataView dv = new DataView(dt); //過濾ParentID,獲得當前的全部子節點 ParentID爲父節點ID dv.RowFilter = "[Parent_ID] = " + Pid; //循環遞歸 foreach (DataRowView Row in dv) { //聲明節點 TreeNode Node = new TreeNode(); //綁定超級連接 Node.NavigateUrl = String.Format("javascript:show('{0}')", Row["Item_Name"].ToString()); //開始遞歸 if (PNode == null) { //添加根節點 Node.Text = Row["Item_Name"].ToString(); treeT.Nodes.Add(Node); Node.Expanded = true; //節點狀態展開 AddTree(Int32.Parse(Row["Item_ID"].ToString()), Node); //再次遞歸 } else { //添加當前節點的子節點 Node.Text = Row["Item_Name"].ToString(); PNode.ChildNodes.Add(Node); Node.Expanded = true; //節點狀態展開 AddTree(Int32.Parse(Row["Item_ID"].ToString()), Node); //再次遞歸 } } } } } }
d.配置文件
<?xml version="1.0"?> <!-- 有關如何配置 ASP.NET 應用程序的詳細消息,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <appSettings> <add key="sqlStr" value="0dd8de75eb51766d66d42ead8ea26b0c533f6fdb009e9fd2e6e1c9867d2766ec499405047e4173a74015f57800e3afb982fd39d96dcc1590c8c943242992c84b "/> </appSettings> <system.web> <compilation debug="true"/> </system.web> </configuration>
e.兩個助手類
using System; using System.Collections.Generic; using System.Web; using System.IO; using System.Security.Cryptography; using System.Text; namespace Yc_TestS.BaseClass { public class EntryCode { /// <summary>加密</summary> public static string EncodeCode(string str) { string key = "david.yc"; DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8)); provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8)); byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(str); MemoryStream stream = new MemoryStream(); CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write); stream2.Write(bytes, 0, bytes.Length); stream2.FlushFinalBlock(); StringBuilder builder = new StringBuilder(); foreach (byte num in stream.ToArray()) { builder.AppendFormat("{0:X2}", num); } stream.Close(); return builder.ToString().Trim(); } /// <summary> Des 解密 GB2312 </summary> public static string DecodeCode(string str) { string key = "david.yc"; DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8)); provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8)); byte[] buffer = new byte[str.Length / 2]; for (int i = 0; i < (str.Length / 2); i++) { int num2 = Convert.ToInt32(str.Substring(i * 2, 2), 0x10); buffer[i] = (byte)num2; } MemoryStream stream = new MemoryStream(); CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write); stream2.Write(buffer, 0, buffer.Length); stream2.FlushFinalBlock(); stream.Close(); return Encoding.GetEncoding("GB2312").GetString(stream.ToArray()).Trim(); } } }
using System; using System.Collections.Generic; using System.Web; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace Yc_TestS.BaseClass { public class YSqlHelper { private static string connectionString = EntryCode.DecodeCode(ConfigurationManager.AppSettings["sqlStr"]);//獲取解密後的數據庫鏈接字符串 /// <summary>執行不帶參數的增刪改SQL語句或存儲過程</summary> /// <param name="cmdText">增刪改SQL語句或存儲過程</param> /// <param name="ct">命令類型</param> /// <returns>受影響的行數</returns> public static int ExecuteNonQuery(string cmdText, CommandType ct) { int res = 0; using (SqlConnection conn = new SqlConnection(connectionString)) { try { conn.Open(); using (SqlCommand cmd = new SqlCommand(cmdText, conn)) { cmd.CommandType = ct; res = cmd.ExecuteNonQuery(); } } catch { } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } } } return res; } /// <summary>執行帶參數的增刪改SQL語句或存儲過程</summary> /// <param name="cmdText">增刪改SQL語句或存儲過程</param> /// <param name="ct">命令類型</param> /// <returns>受影響的行數</returns> public static int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct) { int res = 0; using (SqlConnection conn = new SqlConnection(connectionString)) { try { conn.Open(); using (SqlCommand cmd = new SqlCommand(cmdText, conn)) { cmd.CommandType = ct; cmd.Parameters.AddRange(paras); res = cmd.ExecuteNonQuery(); } } catch { } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } } } return res; } /// <summary> 執行帶參數的查詢SQL語句或存儲過程</summary> /// <param name="cmdText">查詢SQL語句或存儲過程ì</param> /// <param name="paras">參數集合?</param> /// <param name="ct">命令類型</param> /// <returns>DataTable對象</returns> public static DataTable ExecuteQuery(string cmdText, CommandType ct) { DataTable dt = new DataTable(); using (SqlConnection conn = new SqlConnection(connectionString)) { try { conn.Open(); using (SqlCommand cmd = new SqlCommand(cmdText, conn)) { cmd.CommandType = ct; using (SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } } } catch { } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } } } return dt; } /// <summary> 執行帶參數的查詢SQL語句或存儲過程</summary> /// <param name="cmdText">查詢SQL語句或存儲過程ì</param> /// <param name="paras">參數集合?</param> /// <param name="ct">命令類型</param> /// <returns>DataTable對象</returns> public static DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct) { DataTable dt = new DataTable(); using (SqlConnection conn = new SqlConnection(connectionString)) { try { conn.Open(); using (SqlCommand cmd = new SqlCommand(cmdText, conn)) { cmd.CommandType = ct; cmd.Parameters.AddRange(paras); using (SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } } } catch { } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } } } return dt; } } }
5.一些方法記錄
a.控制父結點的開/合狀態
TreeView_Tree.GetNodeFromIndex("1").Expanded=false/true;
b.清除某個父結點下的全部子節點
TreeView_IndexLeft.GetNodeFromIndex("1").Nodes.Clear();
c.設置所選節點,如選中第二個節點
function SetSelNode() { TreeView_Tree.selectedNodeIndex="1"; }
d.獲得所選節點的Text,ID或NodeData
function GetAttribute() { alert(TreeView_Tree.getTreeNode(TreeView_Tree.selectedNodeIndex).getAttribute("Text")); }
//替換Text爲ID或NodeData,可分別獲得所選節點的ID或NodeData
e.修改節點屬性,如修改第一個節點的Text
function ModifyNode() { var node=TreeView_Tree.getTreeNode("0"); node.setAttribute("Text","第一個節點"); }
f.添加節點
function AddNode() { var node=TreeView_Tree.createTreeNode(); node.setAttribute("Text","第一個節點"); TreeView_Tree.add(node); }
g.TreeView 中的SelectedIndexChange不執行
AutoPostBack=true,SelectedIndexChange才能被執行。
h.判斷 TreeView 的一個節點下是否有子節點
if(SelectNode.Nodes.Count==0) { //該節點沒有字節點 }