文章目錄
- 前言
- 一、站點地圖
- 1、定義站點地圖文件
- 2、使用SiteMapPath控件
- 3、SiteMap類
- 4、URL地址映射
- 二、TreeView控件
- 1、使用TreeView控件
- 2、以編程的方式添加節點
- 3、使用TreeView控件導航
- 4、綁定到XML文件
- 5、按需加載節點
- 6、帶復選框的TreeView控件
- 三、Menu控件
- 1、使用Menu控件
- 2、以編程的方式添加菜單項
- 3、使用Menu控件導航
- 4、一個站點地圖示例
- 5、綁定到XML文件
- 6、Menu控件樣式
- 7、為Menu控件應用模板
前言
大型的企業級網站,可能有成百上千個網頁,導航變得十分重要。
好的導航系統能夠方便用戶在多個頁面間來回瀏覽,增加了應用程序的可交互性。
ASP.NET提供了內置的導航技術,讓開發人員創建站點導航變得輕松。
本章內容有:
- ASP.NET中的站點地圖
- 用于導航的高級服務器控件TreeView
- 菜單和導航服務器控件Menu
一、站點地圖
用于定義站點結構。
ASP.NET中的站點地圖導航技術由以下三個文件組成:
- 站點地圖XML文件
- 綁定站點地圖XML文件的SiteMapDataSource數據源控件
- 用于顯示站點地圖的導航控件
1、定義站點地圖文件
站點地圖是一個名為Web.sitemap的XML文件。
ASP.NET站點地圖的基本原理:
ASP.NET內置了一個成為站點地圖提供者的提供者類,名為XmlSiteMapProvider,該提供者能夠從XML中獲取信息。XmlSiteMapProvider將查找位于應用程序
根目錄中的Web.sitemap文件,然后提取該文件中的站點地圖數據并創建相應的SiteMap對象,SiteMapDataSource將使用這些SiteMap對象向導航控件提供導航信息。
Web.site必須位于應用程序目錄下,并且不能更改為其他名稱。
這里要建的導航結構為:
接下來我們詳細記錄建立站點導航的過程:VS2019
(1)新建web項目
(2)新建要調用的產品、服務web窗體頁面
這里需要注意的是,現在項目上右鍵添加兩個文件夾,分別命名為Products、Services,然后分別在兩個文件夾鼠標右鍵建立Web窗體頁面。
(3)新建一個首頁Web窗體頁面,命名為Default.aspx
(4)項目右鍵添加-站點地圖,不要改名字!!!Web.sitemap
這個名稱是固定的!!!
(5)接下來是各個頁面中的代碼:
Default.aspx頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SiteMap3.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>首頁</title>
</head>
<body><form id="form1" runat="server"><div>我是首頁!</div></form><asp:SiteMapPath ID="SiteMap" runat="server"></asp:SiteMapPath>
</body>
</html>
HardwareProduct.aspx頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="HardwareProduct.aspx.cs" Inherits="SiteMap3.Products.HardwareProduct" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>硬件產品</title>
</head>
<body><form id="form1" runat="server"><div>主機、顯示器、網絡終端、收銀機和ATM等設備在現代生活中扮演著重要角色。主機是計算機的核心部件,包含CPU、內存等,負責數據處理。顯示器則是將電子信號轉換為可視圖像的輸出設備,提供清晰的視覺體驗。網絡終端通過網絡獲取資源,簡化多用戶環境下的設備管理。收銀機廣泛應用于商業領域,實現高效準確的交易處理。ATM作為銀行自助服務終端,提供24小時便捷的金融服務。這些設備共同促進了信息化、自動化的發展,提升了工作效率與生活質量。</div></form><asp:SiteMapPath ID="SiteMap" runat="server"></asp:SiteMapPath>
</body>
</html>
SoftwareProduct.aspx頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SoftwareProduct.aspx.cs" Inherits="SiteMap3.Products.SoftwareProduct" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>軟件產品</title>
</head>
<body><form id="form1" runat="server"><div>ERP(企業資源規劃)、CRM(客戶關系管理)、Web系統以及Windows系統等,是現代企業運營與管理的基石。ERP系統整合了企業內部的各項資源,優化了業務流程,提升了管理效率;CRM系統則專注于客戶關系的維護與管理,幫助企業深入理解客戶需求,增強客戶滿意度與忠誠度。Web系統作為互聯網時代的產物,為企業搭建了線上服務平臺,實現了信息的快速傳遞與交互。而Windows系統,作為廣泛應用的操作系統,為上述各類軟件提供了穩定、易用的運行環境,支持著企業日常工作的順利進行。這些系統相互協作,共同推動了企業的數字化轉型與智能化升級。</div><asp:SiteMapPath ID="SiteMap" runat="server"></asp:SiteMapPath></form></body>
</html>
ServiceCenter.aspx頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ServiceCenter.aspx.cs" Inherits="SiteMap3.Services.ServiceCenter" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>服務中心</title>
</head>
<body><form id="form1" runat="server"><div>當您需要享受專業的服務與支持時,歡迎您直接步入本公司服務中心。我們的服務中心以客戶為中心,致力于為每一位訪客提供高效、便捷的登記服務體驗。一踏入中心,您將被溫馨的環境和專業的團隊所包圍。只需簡短的登記流程,即可迅速連接至所需的服務資源。無論是咨詢解答、技術支持還是產品維護,我們都將全力以赴,確保您的需求得到及時響應與滿足。在這里,每一次服務都是我們對品質的承諾,每一份滿意都是您對我們工作的肯定。選擇本公司服務中心,讓優質服務觸手可及。</div></form><asp:SiteMapPath ID="SiteMap" runat="server"></asp:SiteMapPath>
</body>
</html>
ServiceNote.aspx頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ServiceNote.aspx.cs" Inherits="SiteMap3.Services.ServiceNote" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>服務須知</title>
</head>
<body><form id="form1" runat="server"><div>在開始登記服務之前,我們誠摯地邀請您花幾分鐘時間仔細閱讀這里的條款與條件。這些條款不僅是我們服務提供的基礎框架,也是保障您權益與明確雙方責任的重要依據。通過認真閱讀,您將了解到服務的具體內容、范圍、限制以及可能涉及的費用情況。同時,條款中也明確了隱私保護政策,確保您的個人信息在處理過程中得到妥善保護。我們理解這些條款可能涉及較多細節,但請您放心,我們的目標是確保每一次服務都建立在透明、公正、相互尊重的基礎上。因此,在開始登記前,請您務必仔細閱讀并理解這些條款,以便更好地享受我們提供的服務。</div></form><asp:SiteMapPath ID="SiteMap" runat="server"></asp:SiteMapPath>
</body>
</html>
Web.sitemap站點地圖頁面
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" ><siteMapNode url="~/Default.aspx" title="首頁" description="網站首頁"><!-- 這是產品分類節點 --><siteMapNode title="產品分類" description="企業經營的產品"><siteMapNode url="~/Products/HardwareProduct.aspx" title="硬件產品" description="包括主機、顯示器、網絡終端、收銀機、ATM等設備"/><siteMapNode url="~/Products/SoftwareProduct.aspx" title="軟件產品" description="包括ERP、CRM、Web系統、Windows系統等"/></siteMapNode><siteMapNode title="售后服務" description="軟硬件的售后服務"><siteMapNode url="~/Services/ServiceCenter.aspx" title="服務中心" description="直接進入本公司服務中心登記服務"/><siteMapNode url="~/Services/ServiceNote.aspx" title="服務須知" description="在開始登記前,先閱讀這里的條款"/></siteMapNode></siteMapNode>
</siteMap>
運行結果:
2、使用SiteMapPath控件
SiteMapPath控件已經在上面的案例中使用,是在站點地圖結構、結構中對應的頁面做好以后,分別在各個頁面的窗體中加入SiteMapPath控件。
<asp:SiteMapPath ID="SiteMap" runat="server"></asp:SiteMapPath>
一個頁面中的添加如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SiteMap3.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>首頁</title>
</head>
<body><form id="form1" runat="server"><div>我是首頁!</div></form><asp:SiteMapPath ID="SiteMap" runat="server"></asp:SiteMapPath>
</body>
</html>
接下來介紹一些SiteMapPath控件的屬性:
屬性名稱 | 屬性描述 |
---|---|
ParentLevelsDisplay | 允許顯示的父節點的數量,默認情況下SiteMapPath控件顯示所有的父節點 |
PathDirection | 允許反轉SiteMapPath控件顯示的鏈接的順序,可選值有RootToCurrent,這是默認值,表示從根父級顯示到當前級。CurrentToRoot表示從當前頁面顯示到根級 |
PathSeparator | 指定用于分隔節點的字符串,默認的是“>”,可以指定任意的字符 |
RenderCurrentNodeAsLink | 是否允許將SiteMapPath描述的當前節點呈現為鏈接 |
ShowToolTips | 是否允許顯示工具提示 |
SiteMapProvider | 允許SiteMapPath控件指定其他的站點地圖提供者 |
SiteMapPath提供了很多的樣式控制選項,允許對其外觀進行精細的控制。除此以外,還可以對SiteMapPath控件應用模板來自定義外觀,以下列出所有的樣式及模板。
樣式 | 模板 | 說明 |
---|---|---|
NodeStyle | NodeTemplate | 所有除了根節點和當前節點的節點樣式 |
CurrentNodeStyle | CurrentNodeTemplate | 當前節點的樣式 |
RootNodeStyle | RootNodeTemplate | 根節點的樣式 |
PathSeparatorStyle | PathSeparatorTemplate | 節點之間分隔符的樣式 |
3、SiteMap類
使用SiteMapPath控件,開發人員不需要編寫代碼就可以在頁面中添加站點導航,也可以對站點地圖進行編程操作。ASP.NET公開了一個反應站點地圖結構的靜態
的SiteMapPath對象,該對象公開SiteMapNode對象的集合,用于表示站點中每個節點。
SiteMap對象中所有成員都是靜態的,因此無需實例化SiteMap對象。SiteMap自身只具有兩個與導航相關的屬性:
- CurrentNode屬性:用于獲取當前的節點,返回SiteMapNode對象。
- RootNode屬性:用于獲取根節點,返回SiteMapNode對象。
而SiteMap對象的成員SiteMapNode對象具有多個與導航相關的屬性:
屬性 | 屬性說明 |
---|---|
ParentNode | 返回當前節點的上一級節點,包含當前節點。如果是根節點,這個屬性返回一個null引用 |
ChildNode | 返回所有當前節點的子節點集合。可以通過檢查HasChildNodes屬性來判斷當前節點是否有子節點 |
PreviousSibling | 返回相同等級的上一個節點,如果不存在則返回null |
NextSibling | 返回相同等級的下一個節點,如果不存在則返回null |
在首頁中加入一個label控件,用來顯示通過SiteMap對象獲取的節點信息:(需要注意,之前加的那個SiteMapPath控件的名稱不能是SiteMap,不然就會和SiteMap類對象產生二義性,獲取不到屬性!!!!!!!!!!!!!!)
代碼中加入遍歷站點地圖結構的節點信息代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SiteMap3.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>首頁</title>
</head>
<body><form id="form1" runat="server"><div>我是首頁!</div><asp:SiteMapPath ID="SiteMapPath" runat="server"></asp:SiteMapPath><asp:Label ID="lbTree" runat="server" Text="Label"></asp:Label></form></body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace SiteMap3
{public partial class Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){// 獲取所有的站點地圖節點信息lbTree.Text = "當前節點信息:<br/>";lbTree.Text += SiteMap.CurrentNode.Title + "<br/>";lbTree.Text += SiteMap.CurrentNode.Description + "<br/>";if (SiteMap.CurrentNode.NextSibling != null){lbTree.Text += "同級節點的下一個節點信息:" + "<br/>";lbTree.Text += SiteMap.CurrentNode.NextSibling.Title + "<br/>";lbTree.Text += SiteMap.CurrentNode.NextSibling.Description + "<br/>";}}}
}
運行結果:運行結果是在軟件產品頁面中加入了遍歷的結果!!!!!!
4、URL地址映射
URL地址映射就是在瀏覽器中給實際不想顯示的URL地址穿上一個馬甲,因此從實際URL映射到另一個對外顯示的URL地址。
ASP.NET可以在web.config配置文件中使用塊來配置URL地址映射。
下面是一個簡單的URL地址映射的示例代碼:
<?xml version="1.0" encoding="utf-8"?>
<!--有關如何配置 ASP.NET 應用程序的詳細信息,請訪問https://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration><system.web><compilation debug="true" targetFramework="4.5.1" /><httpRuntime targetFramework="4.5.1" /><urlMappings enabled="true"><add url="~/Products/HardwareProduct.aspx" mappedUrl="~/Products/Default.aspx?hardwareproduct=default"/><add url="~/Services/ServiceCenter.aspx"mappedUrl="~/Services/Default.aspx?servicecenter=default"/></urlMappings></system.web><system.codedom><compilers><compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" /><compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" /></compilers></system.codedom>
</configuration>
但是ASP.NET中的地址映射有很大的不足,就是只能硬編碼地址,導致配置文件太大。網上已經有解決方法。
二、TreeView控件
TreeView就是不論是操作系統,還是應用程序的分支點目錄。
TreeView支持以下功能:
- 數據綁定,允許控件的節點綁定到XML、表格或關系數據。
- 站點導航,通過與SiteMapDataSource控件集成實現。
- 節點文本既可以顯示為純文本也可以顯示為超鏈接。
- 借助編程方式訪問TreeView對象模型以動態地創建樹、填充節點、設置屬性等。
- 客戶端節點填充(在支持的瀏覽器上)。
- 在每個節點旁顯示復選框的功能。
- 通過主題、用戶定義的圖像和格式可以實現自定義外觀。
本節將討論使用TreeView控件開發ASP.NET應用程序的導航功能。
新建網站,添加一個TreeView控件。
1、使用TreeView控件
在設計模式下,拖一個TreeView控件,彈出設置框,自動套用格式下很多可以選擇的樹狀圖形式。
選擇數據源,后面會講定義數據源,以及綁定數據源:
如果已經添加了節點,可以編輯節點:
自定義行圖標樣式:
選擇顯示行或者不顯示行,就是連線:
經過初始化的設置,回到標記模式中,看到已經增添了一些屬性:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TreeView.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title></title>
</head>
<body><form id="form1" runat="server"><div></div><asp:TreeView ID="TreeView1" runat="server" ImageSet="Arrows"><HoverNodeStyle Font-Underline="True" ForeColor="#5555DD" /><NodeStyle Font-Names="Tahoma" Font-Size="10pt" ForeColor="Black" HorizontalPadding="5px" NodeSpacing="0px" VerticalPadding="0px" /><ParentNodeStyle Font-Bold="False" /><SelectedNodeStyle Font-Underline="True" ForeColor="#5555DD" HorizontalPadding="0px" VerticalPadding="0px" /></asp:TreeView></form>
</body>
</html>
我們來手動輸入一些屬性,建立一些節點:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TreeView.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title>
</head>
<body><form id="form1" runat="server"><div></div><asp:TreeView ID="TreeView1" runat="server" ImageSet="Arrows"><ParentNodeStyle Font-Bold="False" /><HoverNodeStyle Font-Underline="True" ForeColor="#5555DD" /><SelectedNodeStyle Font-Underline="True" ForeColor="#5555DD" HorizontalPadding="0px" VerticalPadding="0px" /><Nodes><asp:TreeNode Text="軟件開發系列圖書" Value="軟件開發系列圖書"><asp:TreeNode Text=".NET版" Value=".NET版"><asp:TreeNode Text="C# 2008程序設計" Value=" 2008程序設計"></asp:TreeNode><asp:TreeNode Text="ASP.NET 4.0從入門到精通" Value="ASP.NET 4.0從入門到精通"></asp:TreeNode><asp:TreeNode Text="SliverLight 2.0開發人員指南" Value="SliverLight 2.0開發人員指南"></asp:TreeNode><asp:TreeNode Text="WCF程序設計" Value="WCF程序設計"></asp:TreeNode><asp:TreeNode Text="WF本質論" Value="WF本質論"></asp:TreeNode></asp:TreeNode></asp:TreeNode></Nodes><NodeStyle Font-Names="Tahoma" Font-Size="10pt" ForeColor="Black" HorizontalPadding="5px" NodeSpacing="0px" VerticalPadding="0px" /></asp:TreeView></form>
</body>
</html>
運行結果:
TreeView的屬性:
屬性 | 屬性說明 |
---|---|
Tetx | 顯示在節點中的文本 |
ToolTip | 當鼠標懸停在節點上面時顯示的提示信息 |
Value | 保存節點的值,節點的值是一種不可見的附件數據,用于保存節點的附加信息 |
NavigateUrl | 當單擊節點時,節點所鏈接的URL路徑 |
Target | 如果NavigateUrl被設置,用這個屬性設置打開的目標窗口 |
ImageUrl | 顯示在節點前面的圖像URL |
ImageToolTip | 顯示在節點前面的圖片的提示信息 |
2、以編程的方式添加節點
編程方式給TreeView添加節點:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace TreeView
{public partial class Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){// 以編程的方式給TreeView對象添加節點// 新建一個TreeNode對象TreeNode rootNode = new TreeNode("軟件開發系列圖書");// 將rootNode對象添加到TreeView對象的Nodes節點,這是必須的,否則TreeView將不會呈現節點TreeView1.Nodes.Add(rootNode);// 繼續添加子節點TreeNode childNode = new TreeNode(".NET版");childNode.ChildNodes.Add(new TreeNode("C# 2008程序設計"));childNode.ChildNodes.Add(new TreeNode("ASP.NET從入門到精通"));childNode.ChildNodes.Add(new TreeNode("SilverLight2.0開發人員指南"));childNode.ChildNodes.Add(new TreeNode("WCF程序設計"));rootNode.ChildNodes.Add(childNode);}}
}
運行結果:
3、使用TreeView控件導航
首先給項目中加入之前寫的這個Web.sitemap站點導航文件。
再加入一個TreeView控件:
窗體頁面設計代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TreeView.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title>
</head>
<body><form id="form1" runat="server"><div></div><asp:TreeView ID="TreeView1" runat="server" ImageSet="Arrows"><ParentNodeStyle Font-Bold="False" /><HoverNodeStyle Font-Underline="True" ForeColor="#5555DD" /><SelectedNodeStyle Font-Underline="True" ForeColor="#5555DD" HorizontalPadding="0px" VerticalPadding="0px" /><%-- <Nodes><asp:TreeNode Text="軟件開發系列圖書" Value="軟件開發系列圖書"><asp:TreeNode Text=".NET版" Value=".NET版"><asp:TreeNode Text="C# 2008程序設計" Value=" 2008程序設計"></asp:TreeNode><asp:TreeNode Text="ASP.NET 4.0從入門到精通" Value="ASP.NET 4.0從入門到精通"></asp:TreeNode><asp:TreeNode Text="SliverLight 2.0開發人員指南" Value="SliverLight 2.0開發人員指南"></asp:TreeNode><asp:TreeNode Text="WCF程序設計" Value="WCF程序設計"></asp:TreeNode><asp:TreeNode Text="WF本質論" Value="WF本質論"></asp:TreeNode></asp:TreeNode></asp:TreeNode></Nodes>--%><NodeStyle Font-Names="Tahoma" Font-Size="10pt" ForeColor="Black" HorizontalPadding="5px" NodeSpacing="0px" VerticalPadding="0px" /></asp:TreeView><asp:TreeView ID="TreeView2" runat="server" ImageSet="Contacts" NodeIndent="10"><HoverNodeStyle Font-Underline="False" /><NodeStyle Font-Names="Verdana" Font-Size="8pt" ForeColor="Black" HorizontalPadding="5px" NodeSpacing="0px" VerticalPadding="0px" /><ParentNodeStyle Font-Bold="True" ForeColor="#5555DD" /><SelectedNodeStyle Font-Underline="True" HorizontalPadding="0px" VerticalPadding="0px" /></asp:TreeView><asp:TreeView ID="TreeView3" runat="server" DataSourceID="SiteMapDataSource1"></asp:TreeView><asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" /></form>
</body>
</html>
后臺代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace TreeView
{public partial class Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){// 以編程的方式給TreeView對象添加節點//====================================第一種:直接編程添加TreeView節點================================================// 新建一個TreeNode對象TreeNode rootNode = new TreeNode("軟件開發系列圖書");// 將rootNode對象添加到TreeView對象的Nodes節點,這是必須的,否則TreeView將不會呈現節點TreeView1.Nodes.Add(rootNode);// 繼續添加子節點TreeNode childNode = new TreeNode(".NET版");childNode.ChildNodes.Add(new TreeNode("C# 2008程序設計"));childNode.ChildNodes.Add(new TreeNode("ASP.NET從入門到精通"));childNode.ChildNodes.Add(new TreeNode("SilverLight2.0開發人員指南"));childNode.ChildNodes.Add(new TreeNode("WCF程序設計"));rootNode.ChildNodes.Add(childNode);//======================================第二種,通過編程綁定站點地圖信息添加TreeView節點==============================================// 以下是TreeView2的使用導航功能的代碼// 初始化根節點TreeNode node = new TreeNode("首頁");// 調用地柜方法遍歷添加節點LoadSiteMap(SiteMap.RootNode, node);TreeView2.Nodes.Add(node);//======================================第三種,通過編程綁定SiteMapDataSource控件添加TreeView節點=====================================// 設計界面上增加了一個TreeView3,并新增一個SiteMapDataSource1,然后將二者通過數據源選項綁定}protected void LoadSiteMap(SiteMapNode node, TreeNode tvNode){// 獲取根節點的子節點int count = node.ChildNodes.Count;// 這里循環遍歷節點for (int i = 0; i < count; i++){// 獲取根節點的子節點SiteMapNode smNode = node.ChildNodes[i];// 從子節點獲取導航信息TreeNode tempNode = new TreeNode(smNode.Title, "", "", smNode.Url, "");tvNode.ChildNodes.Add(tempNode);if (smNode.HasChildNodes){// 如果當前節點還有子節點,則調用遞歸過程進行遍歷LoadSiteMap(smNode, tempNode);}}}}
}
運行結果:
4、綁定到XML文件
TreeView具有顯示層次結構數據的優勢,而開發人員通常使用XML文件來保存層次結構的數據,TreeView控件通過與XmlDataSource控件的結合,使綁定XML文件變得非常簡單。
XML文件代碼:
<?xml version="1.0" encoding="utf-8" ?>
<Books Title="圖書展示區"><Category id="software" text="軟件編程類"><book id="book1" text="ASP.NET程序設計"/><book id="book2" text="C# 2008 網絡技術詳解"/></Category><Category id="hardware" text="硬件編程類"><book id="book3" text="MySQL數據庫設計" /><book id="book4" text="Linux設備驅動程序開發"/></Category>
</Books>
TreeView4與XmlDataSource控件代碼:
<asp:TreeView ID="TreeView4" runat="server" ImageSet="XPFileExplorer" NodeIndent="15" DataSourceID="XmlDataSource1"><HoverNodeStyle Font-Underline="True" ForeColor="#6666AA" /><NodeStyle Font-Names="Tahoma" Font-Size="8pt" ForeColor="Black" HorizontalPadding="2px" NodeSpacing="0px" VerticalPadding="2px" /><SelectedNodeStyle BackColor="#B5B5B5" Font-Underline="False" HorizontalPadding="0px" VerticalPadding="0px" /><ParentNodeStyle Font-Bold="False" /></asp:TreeView><asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/Book.xml" OnTransforming="XmlDataSource1_Transforming"></asp:XmlDataSource>
這樣給TreeView綁定數據源看起來挺簡單的,不過不能直接綁定到SqlDataSource或者ObjectDataSource控件。
5、按需加載節點
如果要加在到TreeView控件中的數據量非常大,一次性加載將顯著增加服務器端的負載和客戶端內存的占比量,并且會造成請求的延遲。TreeView
控件提供了按需加載的特性來解決這個問題。在首次加載時,TreeView只顯示頂級節點的少量數據,當用戶單擊TreeView中的展開節點圖標時,將再次從服務器端加載所需要的的數據。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="PopulateOnDemand.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title></title>
</head>
<body><form id="form1" runat="server"><div></div><asp:TreeView ID="TreeView1" runat="server" OnTreeNodePopulate="TreeView1_TreeNodePopulate"><Nodes><asp:TreeNode PopulateOnDemand="true" Text="按需加載頂層節點" Value="按需加載頂層節點"></asp:TreeNode></Nodes></asp:TreeView></form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace PopulateOnDemand
{public partial class Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){}protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e){for (int i = 0; i < 3; i++){TreeNode newNode = new TreeNode();newNode.Text = "動態加載的節點" + i.ToString();// 這里將新建的節點的PopulateOnDemand屬性也設置為True,將會形成一個無限遞歸newNode.PopulateOnDemand = true;// TreeNodeEventArgs中的Node屬性表示當前的節點e.Node.ChildNodes.Add(newNode);}}}
}
6、帶復選框的TreeView控件
將綁定節點的ShowCheckBoxes
屬性設置為true進行節點的復選設置。距離例子在實際應用中再查詢吧。
三、Menu控件
ASP.NET提供了另一個重量級的導航控件Meun。使用該控件,開發人員可以在網頁上模擬Windows的菜單導航效果。ASP.NET的Menu有兩種模式:
- 靜態模式:每個菜單項是完全分開的,用戶可以點擊菜單中的任何菜單項。
- 動態模式:默認值顯示部分菜單內容,當用戶移動鼠標到靜態內容頁上時,彈出子菜單項。
1、使用Menu控件
新建Menu項目并拖入Menu控件,初始化設置:
在設計模式下,手動寫入靜態的菜單項:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Menu.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title></title>
</head>
<body><form id="form1" runat="server"><div></div><asp:Menu ID="Menu1" runat="server" BackColor="#FFFBD6" DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#990000" StaticSubMenuIndent="10px"><DynamicHoverStyle BackColor="#990000" ForeColor="White" /><DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /><DynamicMenuStyle BackColor="#FFFBD6" /><DynamicSelectedStyle BackColor="#FFCC66" /><StaticHoverStyle BackColor="#990000" ForeColor="White" /><StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /><StaticSelectedStyle BackColor="#FFCC66" /><Items><asp:MenuItem Text="首頁" Value="首頁"></asp:MenuItem><asp:MenuItem Text="公司介紹" Value="公司介紹"><asp:MenuItem Text="公司信息" Value="公司信息"></asp:MenuItem><asp:MenuItem Text="公司規模" Value="公司規模"></asp:MenuItem><asp:MenuItem Text="公司人員" Value="公司人員"></asp:MenuItem></asp:MenuItem><asp:MenuItem Text="產品信息" Value="產品信息"><asp:MenuItem Text="硬件產品" Value="硬件產品"></asp:MenuItem><asp:MenuItem Text="軟件產品" Value="軟件產品"></asp:MenuItem><asp:MenuItem Text="專利產品" Value="專利產品"></asp:MenuItem></asp:MenuItem><asp:MenuItem Text="服務中心" Value="服務中心"><asp:MenuItem Text="服務事項" Value="服務事項"></asp:MenuItem><asp:MenuItem Text="服務申報" Value="服務申報"></asp:MenuItem><asp:MenuItem Text="服務建議" Value="服務建議"></asp:MenuItem></asp:MenuItem><asp:MenuItem Text="關于" Value="關于"></asp:MenuItem></Items></asp:Menu></form>
</body>
</html>
運行結果:
Menu兩個重要屬性控制菜單是靜態顯示還是動態顯示:
屬性 | 說明 |
---|---|
StaticDisplayLevels | 控制靜態顯示的菜單層次,該屬性默認值為1,表示只顯示asp:MenuItem中第一層嵌套的節點 |
MaxiumDynamicDisplayLevels | 控制動態顯示的節點層次數。默認值是3,表示可以動態地彈出3個層次的菜單。如果設置值為0則不動態顯示任何菜單項。 |
通常這兩個屬性可以搭配使用,以獲得菜單的靜態和動態的顯示效果。
每個MenuItem
有多個屬性。如下:
屬性 | 說明 |
---|---|
Text | 顯示在每個菜單項上的文本 |
ToolTip | 當鼠標懸停在菜單上時顯示的信息 |
Value | 存儲一個附加的菜單項的數據 |
NavigateUrl | 當單擊菜單項時,自動跳轉到的Url地址。也可以處理Menu.MenuItemClick事件執行相應的行為 |
Target | 當NavigateUrl屬性設置后,Target屬性用于設置目標Url打開的框架或窗體 |
Selectable | 指定菜單項是否可以被用戶選擇 |
ImageUrl | 在菜單項的文本左線顯示的圖片Url |
PopOutImageUrl | 如果包含子菜單,則在菜單項文本的右側顯示的頭像 |
SeparatorUrl | 菜單項分隔項的圖片Url |
2、以編程的方式添加菜單項
Menu控件提供了Items集合的屬性,這是一個MenuItemCollection集合類型的屬性,可以向該屬性添加菜單項來實現動態添加菜單項的效果。
我們將原來靜態添加的菜單項先注釋,然后再頁面的Page_Load中動態添加:
窗體代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Menu.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title></title>
</head>
<body><form id="form1" runat="server"><div></div><asp:Menu ID="Menu1" runat="server" BackColor="#FFFBD6" DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#990000" StaticSubMenuIndent="10px"><DynamicHoverStyle BackColor="#990000" ForeColor="White" /><DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /><DynamicMenuStyle BackColor="#FFFBD6" /><DynamicSelectedStyle BackColor="#FFCC66" /><StaticHoverStyle BackColor="#990000" ForeColor="White" /><StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /><StaticSelectedStyle BackColor="#FFCC66" /><%-- <Items><asp:MenuItem Text="首頁" Value="首頁"></asp:MenuItem><asp:MenuItem Text="公司介紹" Value="公司介紹"><asp:MenuItem Text="公司信息" Value="公司信息"></asp:MenuItem><asp:MenuItem Text="公司規模" Value="公司規模"></asp:MenuItem><asp:MenuItem Text="公司人員" Value="公司人員"></asp:MenuItem></asp:MenuItem><asp:MenuItem Text="產品信息" Value="產品信息"><asp:MenuItem Text="硬件產品" Value="硬件產品"></asp:MenuItem><asp:MenuItem Text="軟件產品" Value="軟件產品"></asp:MenuItem><asp:MenuItem Text="專利產品" Value="專利產品"></asp:MenuItem></asp:MenuItem><asp:MenuItem Text="服務中心" Value="服務中心"><asp:MenuItem Text="服務事項" Value="服務事項"></asp:MenuItem><asp:MenuItem Text="服務申報" Value="服務申報"></asp:MenuItem><asp:MenuItem Text="服務建議" Value="服務建議"></asp:MenuItem></asp:MenuItem><asp:MenuItem Text="關于" Value="關于"></asp:MenuItem></Items>--%></asp:Menu></form>
</body>
</html>
后臺代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace Menu
{public partial class Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){MenuItem mi = new MenuItem();mi.Text = "首頁";mi.ToolTip = "顯示網站的首頁";Menu1.Items.Add(mi);MenuItem companymi = new MenuItem("公司信息");companymi.ChildItems.Add(new MenuItem("公司信息"));companymi.ChildItems.Add(new MenuItem("公司規模"));companymi.ChildItems.Add(new MenuItem("公司人員"));Menu1.Items.Add(companymi);MenuItem productmi = new MenuItem("產品信息");productmi.ChildItems.Add(new MenuItem("硬件產品"));productmi.ChildItems.Add(new MenuItem("軟件產品"));productmi.ChildItems.Add(new MenuItem("專利產品"));Menu1.Items.Add(productmi);MenuItem servicemi = new MenuItem("服務信息");servicemi.ChildItems.Add(new MenuItem("服務事項"));servicemi.ChildItems.Add(new MenuItem("服務申請"));servicemi.ChildItems.Add(new MenuItem("服務建議"));Menu1.Items.Add(servicemi);MenuItem aboutmi = new MenuItem("關于");Menu1.Items.Add(aboutmi);}}
}
運行結果:
3、使用Menu控件導航
Menu控件作為一種導航控件,同樣可以輕松綁定到SiteMapDataSource控件來實現站點導航。
新建項目MenuNavigate:
Web.site站點地圖文件代碼:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" ><siteMapNode url="~/Default.aspx" title="首頁" description="網站首頁"><!-- 這是產品分類節點 --><siteMapNode title="產品分類" description="企業經營的產品"><siteMapNode url="~/Products/HardwareProduct.aspx" title="硬件產品" description="包括主機、顯示器、網絡終端、收銀機、ATM等設備"/><siteMapNode url="~/Products/SoftwareProduct.aspx" title="軟件產品" description="包括ERP、CRM、Web系統、Windows系統等"/></siteMapNode><siteMapNode title="售后服務" description="軟硬件的售后服務"><siteMapNode url="~/Services/ServiceCenter.aspx" title="服務中心" description="直接進入本公司服務中心登記服務"/><siteMapNode url="~/Services/ServiceNote.aspx" title="服務須知" description="在開始登記前,先閱讀這里的條款"/></siteMapNode></siteMapNode>
</siteMap>
運行結果:
4、一個站點地圖示例
站點地圖Web.sitemap中定義的站點導航代碼:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" ><siteMapNode url="" title="首頁" description=""><siteMapNode title="產品"><siteMapNode url="Default.aspx?node=hardware" title="硬件"><siteMapNode title="硬件"/><siteMapNode title="鍵盤"/><siteMapNode title="網卡"/><siteMapNode title="顯示器"/><siteMapNode title="整機"/></siteMapNode><siteMapNode url="Default.aspx?node=software" title="軟件"><siteMapNode title="電子表格"/><siteMapNode title="文檔處理器"/><siteMapNode title="電子郵件"/><siteMapNode title="圖像處理"/><siteMapNode title="游戲軟件"/></siteMapNode><siteMapNode url="Default.aspx?node=books" title="書籍"><siteMapNode title="編程"/><siteMapNode title="調試"/><siteMapNode title="測試"/><siteMapNode title="Web應用程序"/><siteMapNode title="WinForm應用程序"/></siteMapNode></siteMapNode><siteMapNode title="服務"><siteMapNode url="Default.aspx?node=consulting" title="咨詢"><siteMapNode title="流程"/><siteMapNode title="管理"/><siteMapNode title="招聘"/></siteMapNode><siteMapNode url="Default.aspx?node=development" title="開發"><siteMapNode title="Web應用程序"/><siteMapNode title="企業級應用程序"/><siteMapNode title="數據庫應用程序"/></siteMapNode></siteMapNode><siteMapNode title="支持"><siteMapNode url="Default.aspx?node=drivers" title="驅動"><siteMapNode title="聲卡"/><siteMapNode title="網絡"/><siteMapNode title="打印機"/><siteMapNode title="Medom"/></siteMapNode><siteMapNode url="Default.aspx?node=manuals" title="手冊"><siteMapNode title="應用程序"/><siteMapNode title="故障診斷"/><siteMapNode title="安裝"/><siteMapNode title="Internet"/></siteMapNode><siteMapNode url="Default.aspx?node=updates" title="更新"><siteMapNode title="發行版"/><siteMapNode title="游戲包"/></siteMapNode></siteMapNode></siteMapNode>
</siteMap>
5、綁定到XML文件
這里綁定的項還要綁定一下:
XML文件代碼:
<?xml version="1.0" encoding="utf-8" ?>
<Books Title="軟硬件書籍區"><Category id="category1" title="軟件書籍區"><book id="book1" title="ASP.NET程序設計"></book><book id="book2" title="C#程序設計"></book><book id="book3" title="DELPHI2009程序設計"></book><book id="book4" title="C++程序設計"></book><book id="book5" title="Java程序設計"></book></Category><Category id="category2" title="硬件書籍區"><book id="book1" title="PC升級與維護大全"></book><book id="book2" title="TCP/IP路由技術"></book><book id="book3" title="思科教程"></book><book id="book4" title="匯編語言程序設計"></book><book id="book5" title="單片機程序設計"></book></Category>
</Books>
窗體設計代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="BingdingToXml.Default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title></title>
</head>
<body><form id="form1" runat="server"><div></div><asp:Menu ID="Menu1" runat="server" BackColor="#E3EAEB" DataSourceID="XmlDataSource1" DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#666666" Orientation="Horizontal" StaticSubMenuIndent="10px"><DynamicHoverStyle BackColor="#666666" ForeColor="White" /><DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /><DynamicMenuStyle BackColor="#E3EAEB" /><DynamicSelectedStyle BackColor="#1C5E55" /><StaticHoverStyle BackColor="#666666" ForeColor="White" /><StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /><StaticSelectedStyle BackColor="#1C5E55" /></asp:Menu><asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/Books.xml"></asp:XmlDataSource></form>
</body>
</html>
運行結果:
6、Menu控件樣式
Menu控件與TreeView控件類似,提供了大量的外觀控制項。
以下是Menu控件的樣式:
靜態模式樣式 | 動態模式樣式 | 樣式說明 |
---|---|---|
StaticMenuStyle | DynamicMenuStyle | 設置Menu控件的整個外觀樣式 |
StaticMenuItemStyle | DynamicMenuItemStyle | 設置單個菜單項的樣式 |
StaticSelectedStyle | DynamicSelectedStyle | 設置所選擇的菜單項的樣式 |
StaticHoverStyle | DynamicHoverStyle | 設置當鼠標懸停在菜單項上時的樣式 |
7、為Menu控件應用模板
ASP.NET中的Menu控件是一個強大的導航控件,允許開發人員創建復雜的菜單結構。通過使用模板(Templates),你可以自定義Menu控件的外觀和行為,以滿足特定的需求。以下是如何在ASP.NET中為Menu控件使用模板的詳細介紹。
-
- 基本概念
ASP.NET Menu控件支持以下幾種模板:
StaticItemTemplate:用于靜態菜單項的模板。
DynamicItemTemplate:用于動態菜單項的模板。
StaticMenuItemTemplate:用于靜態菜單項的容器模板。
DynamicMenuItemTemplate:用于動態菜單項的容器模板。
-
- 示例代碼
以下是一個示例,展示如何為Menu控件使用模板:
2.1. ASPX頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MenuTemplate.aspx.cs" Inherits="MenuTemplate" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>Menu Template Example</title><style>.menu-item {padding: 5px;background-color: #f0f0f0;border: 1px solid #ccc;margin: 2px;}.menu-item:hover {background-color: #e0e0e0;}</style>
</head>
<body><form id="form1" runat="server"><asp:Menu ID="Menu1" runat="server" Orientation="Horizontal"><StaticItemTemplate><div class="menu-item"><%# Eval("Text") %></div></StaticItemTemplate><DynamicItemTemplate><div class="menu-item"><%# Eval("Text") %></div></DynamicItemTemplate></asp:Menu></form>
</body>
</html>
2.2. 代碼隱藏文件(C#)
using System;
using System.Web.UI.WebControls;public partial class MenuTemplate : System.Web.UI.Page
{protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){BindMenu();}}private void BindMenu(){MenuItem home = new MenuItem("Home", "Home");MenuItem about = new MenuItem("About", "About");MenuItem services = new MenuItem("Services", "Services");MenuItem contact = new MenuItem("Contact", "Contact");Menu1.Items.Add(home);Menu1.Items.Add(about);Menu1.Items.Add(services);Menu1.Items.Add(contact);MenuItem webDesign = new MenuItem("Web Design", "WebDesign");MenuItem seo = new MenuItem("SEO", "SEO");services.ChildItems.Add(webDesign);services.ChildItems.Add(seo);}
}