因为SqlDataSource控件还是ObjectDatasource控件都没有实现IHierarchicalDataSource接口,所以Menu控件表现数据库数据,有两种方法:
一、创建自己的SqlHierachicalDataSource控件。就是继承IHierarchicalDataSource基类。
二、通过编程的方法为Menu控件创建菜单项目。
<%@ Page Language="C#" %> <%@ Import Namespace="System.Web.Configuration" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script runat="server"> /// <summary> /// Only populate the menu when the page first loads /// </summary> void Page_Load() { if (!Page.IsPostBack) PopulateMenu(); } /// <summary> /// Get the data from the database and create the top-level /// menu items /// </summary> private void PopulateMenu() { DataTable menuData = GetMenuData(); AddTopMenuItems(menuData); } /// <summary> /// Use a DataAdapter and DataTable to grab the database data /// </summary> /// <returns></returns> private DataTable GetMenuData() { // Get Categories table string selectCommand = "SELECT CategoryId,ParentId,Name FROM Categories"; string conString = WebConfigurationManager.ConnectionStrings["Categories"].ConnectionString; SqlDataAdapter dad = new SqlDataAdapter(selectCommand, conString); DataTable dtblCategories = new DataTable(); dad.Fill(dtblCategories); return dtblCategories; } /// <summary> /// Filter the data to get only the rows that have a /// null ParentID (these are the top-level menu items) /// </summary> private void AddTopMenuItems(DataTable menuData) { DataView view = new DataView(menuData); view.RowFilter = "ParentID IS NULL"; foreach (DataRowView row in view) { MenuItem newMenuItem = new MenuItem(row["Name"].ToString(), row["CategoryId"].ToString()); Menu1.Items.Add(newMenuItem); AddChildMenuItems(menuData, newMenuItem); } } /// <summary> /// Recursively add child menu items by filtering by ParentID /// </summary> private void AddChildMenuItems(DataTable menuData, MenuItem parentMenuItem) { DataView view = new DataView(menuData); view.RowFilter = "ParentID=" + parentMenuItem.Value; foreach (DataRowView row in view) { MenuItem newMenuItem = new MenuItem(row["Name"].ToString(), row["CategoryId"].ToString()); parentMenuItem.ChildItems.Add(newMenuItem); AddChildMenuItems(menuData, newMenuItem); } } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <style type="text/css"> .menuItem { border:Solid 1px black; width:100px; padding:2px; background-color:#eeeeee; } .menuItem a { color:blue; } .grid { margin-top:10px; } .grid td, .grid th { padding:10px; } </style> <title>Menu Database</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Menu id="Menu1" Orientation="horizontal" StaticMenuItemStyle-CssClass="menuItem" DynamicMenuItemStyle-CssClass="menuItem" Runat="server" /> <asp:GridView id="grdProducts" DataSourceID="srcProducts" CssClass="grid" AutoGenerateColumns="false" Runat="server"> <Columns> <asp:BoundField DataField="ProductName" HeaderText="Product" /> <asp:BoundField DataField="Price" HeaderText="Price" DataFormatString="{0:c}" /> </Columns> </asp:GridView> <asp:SqlDataSource id="srcProducts" ConnectionString="<%$ ConnectionStrings:Categories %>" SelectCommand="SELECT ProductName,Price FROM Products WHERE CategoryId=@CategoryId" Runat="server"> <SelectParameters> <asp:ControlParameter Name="CategoryId" ControlID="Menu1" /> </SelectParameters> </asp:SqlDataSource> </div> </form> </body> </html>
|