我想从数据库创建菜单并在菜单控制中显示。
代码在.aspx页面:
<asp:Menu ID="Menu1" Orientation="horizontal" StaticMenuItemStyle-CssClass="menuItem"
DynamicMenuItemStyle-CssClass="menuItem" runat="server">
在.cs页面中大师:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
populateMenuItem();
}
}
private void populateMenuItem()
{
DataTable menuData = GetMenuData();
AddTopMenuItems(menuData);
}
/// Filter the data to get only the rows that have a
/// null ParentID (This will come on the top-level menu items)
private void AddTopMenuItems(DataTable menuData)
{
DataView view = new DataView(menuData);
view.RowFilter = "DepartmentParentID IS NULL";
foreach (DataRowView row in view)
{
//MenuItem newMenuItem = new MenuItem(row["DepartmentName"].ToString(), row["DepartmentID"].ToString());
MenuItem newMenuItem = new MenuItem(row["DepartmentName"].ToString(), row["DepartmentID"].ToString());
Menu1.Items.Add(newMenuItem);
AddChildMenuItems(menuData, newMenuItem);
}
}
//This code is used to recursively add child menu items by filtering by ParentID
private void AddChildMenuItems(DataTable menuData, MenuItem parentMenuItem)
{
DataView view = new DataView(menuData);
view.RowFilter = "DepartmentParentID=" + parentMenuItem.Value;
foreach (DataRowView row in view)
{
MenuItem newMenuItem = new MenuItem(row["DepartmentName"].ToString(), row["DepartmentID"].ToString());
parentMenuItem.ChildItems.Add(newMenuItem);
AddChildMenuItems(menuData, newMenuItem);
}
}
private DataTable GetMenuData()
{
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand("SELECT DepartmentID,OfficeID,DepartmentName,DepartmentParentID,IsActive,CreatedByID,CreatedDate,LastModifiedByID,LastModifiedDt FROM DepartmentMst", con))
{
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
}
问题出在AddTopMenuItems()方法中,它显示&#34;对象引用未设置为对象的实例&#34;在线Menu1.Items.Add(newMenuItem); 不知道为什么?
这是SQLSERVER2008 DepartmentMst中的数据:
DepartmentID DepartmentName IsActive DepartmentParentID
1 HR 1 NULL
2 IT 1 NULL
3 Operations 1 NULL
4 Desktop Engineer 1 2
5 Network Engineer 1 2
6 Employee Salary 1 1
当DepartmentParentID为NULL时,它是Main Menu,如果不为null,则它是Child节点,并且尊重其Parent ID。
此处示例http://chandradev819.wordpress.com/2011/07/03/how-to-bind-asp-net-menu-control-with-database/
帮助感谢!
答案 0 :(得分:4)
我怀疑您已将菜单控件放在主页的内容占位符中:
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
<asp:Menu ID="Menu1" Orientation="horizontal" StaticMenuItemStyle-CssClass="menuItem"
DynamicMenuItemStyle-CssClass="menuItem" runat="server" />
</asp:ContentPlaceHolder>
ContentPlaceHolder控件用于定义母版页的区域,该区域可以替换为与母版页关联的其他页面中的内容(显示子页面)。
由于菜单将是从母版页继承的所有页面之间的共享控件,只需将菜单移动到外部内容占位符的任何位置,您就可以了:
<asp:Menu ID="Menu1" Orientation="horizontal" StaticMenuItemStyle-CssClass="menuItem"
DynamicMenuItemStyle-CssClass="menuItem" runat="server" />
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
答案 1 :(得分:0)
**Creating Dynamic CSS Menu From Database SQL Server in ASP.Net Using C#.Net OR create dynamically menu and submenu from database in asp .net**
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DynamicCSSMenu.aspx.cs" Inherits="DynamicCSSMenu" %>
<!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>Creating Dynamic CSS Menu From Database SQL Server in ASP.Net Using C#.Net/VB.NET
</title>
<style type="text/css">
.ParentMenu
{
font-size: small;
font-family: Tahoma;
font-weight: bold;
padding-left: 6px;
padding-right: 6px;
text-align: center;
background-color: #8B008B;
color: White;
border: 1px solid black;
}
.ParentMenu:hover
{
font-family: Tahoma;
font-weight: bold;
padding-left: 6px;
padding-right: 6px;
text-align: center;
border: 1px solid black;
font-size: small;
}
.ChildMenu
{
background-color: #8B008B;
font-weight: bold;
font-family: Tahoma;
padding-top: 4px;
padding-bottom: 4px;
padding-right: 5px;
padding-left: 5px;
text-align: left;
font-size: small;
color: White;
border: 1px solid black;
}
.ChildMenu:hover
{
font-weight: bold;
font-family: Tahoma;
padding-top: 4px;
padding-bottom: 4px;
padding-right: 6px;
padding-left: 6px;
text-align: left;
font-size: small;
border: 1px solid black;
background-color: Black;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Menu DynamicSelectedStyle-Font-Italic="true" ID="dynamicMENU" runat="server"
Orientation="Horizontal" DynamicVerticalOffset="4" OnMenuItemClick="dynamicMENU_MenuItemClick">
<StaticMenuItemStyle Width="100" CssClass="ParentMenu" />
<DynamicMenuItemStyle Width="250" CssClass="ChildMenu" />
</asp:Menu>
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
public partial class DynamicCSSMenu : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetMenu();
}
}
public void GetMenu()
{
DataSet dsParentMenu = getPARENTMENU();
DataRowCollection drcParentMenu = dsParentMenu.Tables[0].Rows;
DataSet dsChildMenuAll = getCHILDMENU();
DataTable drcChildMenuAll = dsChildMenuAll.Tables[0];
MenuItem mainMENUITEM;
MenuItem childMENUITEM;
foreach (DataRow drParentMenu in drcParentMenu)
{
mainMENUITEM = new MenuItem(drParentMenu["ParentMenu_Name"].ToString());
dynamicMENU.Items.Add(mainMENUITEM);
DataRow[] drcChildMenu = drcChildMenuAll.Select("Parent_ID=" + "'" + drParentMenu["ID"].ToString() + "'");
foreach (DataRow drSUBMENUITEM in drcChildMenu)
{
childMENUITEM = new MenuItem(drSUBMENUITEM["ChildMenu_Name"].ToString());
mainMENUITEM.ChildItems.Add(childMENUITEM);
childMENUITEM.NavigateUrl = drSUBMENUITEM["ChildMenu_URL"].ToString();
}
}
mainMENUITEM = new MenuItem("Logout");
dynamicMENU.Items.Add(mainMENUITEM);
}
public DataSet getPARENTMENU()
{
SqlConnection myConnection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["con"].ToString());
string str_query = string.Empty;
str_query = "SELECT * FROM Parent_Menu";
SqlDataAdapter daPARENT = new SqlDataAdapter(str_query, myConnection);
DataSet dsTEMP = new DataSet();
daPARENT.Fill(dsTEMP, "tablePARENT");
return dsTEMP;
}
public DataSet getCHILDMENU()
{
SqlConnection myConnection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["con"].ToString());
string str_querychild = string.Empty;
str_querychild = "SELECT * FROM Child_Menu";
SqlDataAdapter daCHILD = new SqlDataAdapter(str_querychild, myConnection);
DataSet dsTEMP = new DataSet();
daCHILD.Fill(dsTEMP, "tableCHILD");
return dsTEMP;
}
protected void dynamicMENU_MenuItemClick(object sender, MenuEventArgs e)
{
Response.Redirect("~/index.aspx");
}
}