How to Create Dynamic Menu from Database using Men

2019-06-02 08:18发布

问题:

I want to create a menu from Database and show in Menu Control.

Code Here in .aspx page:

 <asp:Menu ID="Menu1" Orientation="horizontal" StaticMenuItemStyle-CssClass="menuItem"
                            DynamicMenuItemStyle-CssClass="menuItem" runat="server">

In .cs Page of Master:

 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;
            }

        }
    }

The Problem is in AddTopMenuItems() Method where it shows "Object reference not set to instance of an object" at line Menu1.Items.Add(newMenuItem); Don't know Why?

Here is Data in 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

When the DepartmentParentID is NULL then it is Main Menu and if not null then it is Child node with respected to its Parent ID.

Sample here http://chandradev819.wordpress.com/2011/07/03/how-to-bind-asp-net-menu-control-with-database/

Help Appreciated!

回答1:

I suspect that you've placed the menu control inside the content place holder of the master page:

<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
            <asp:Menu ID="Menu1" Orientation="horizontal" StaticMenuItemStyle-CssClass="menuItem"
                DynamicMenuItemStyle-CssClass="menuItem" runat="server" />
        </asp:ContentPlaceHolder>

A ContentPlaceHolder control is used to define a region of the Master Page which can be substituted with content from another page associated with the master page(display child pages).

Since the menu will be a shared control among all the pages inheriting from your master page simply move the menu anywhere outside the content place holder and you'll be good to go:

<asp:Menu ID="Menu1" Orientation="horizontal" StaticMenuItemStyle-CssClass="menuItem"
    DynamicMenuItemStyle-CssClass="menuItem" runat="server" />
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>


回答2:

    **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");
    }
}