2

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!

0

2 Answers 2

4

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>
Sign up to request clarification or add additional context in comments.

4 Comments

Plz tell me how to get the Selected MenuItem in Content Page from Master page. Eg: if Department is "DesktopEngineer" then i need its corresponding value that i have stored in Database?
Have a look at this post - stackoverflow.com/questions/2770042/…
I am not using the site map here i am populating menus from SQLServer table....so how to get the value of Current MenuItem Selected value?
Ok, this is a completely different issue to the original question.I would suggest posting a new question and I'm sure someone in the community would be more than happy to assist you
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");
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.