asp.net recursion menu menuitem

¿Cómo crear un menú dinámico desde la base de datos usando el control de menú en asp.net?



recursion menu (1)

Quiero crear un menú desde la Base de datos y mostrarlo en el Control de menú.

Codifique aquí en la página .aspx:

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

En .cs Página del Maestro:

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

El problema está en el método AddTopMenuItems () donde muestra "Referencia de objeto no configurada como instancia de un objeto" en la línea Menu1.Items.Add (newMenuItem); No sé por qué?

Aquí están los datos en 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

Cuando el DepartmentParentID es NULL, entonces es Main Menu y, si no es nulo, es un nodo Child respetado a su Parent ID.

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

Ayuda apreciada!


Sospecho que ha colocado el control del menú dentro del titular del lugar del contenido de la página maestra:

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

Un control ContentPlaceHolder se utiliza para definir una región de la Página maestra que puede sustituirse por contenido de otra página asociada a la página maestra (mostrar páginas secundarias).

Dado que el menú será un control compartido entre todas las páginas heredadas de su página maestra, simplemente mueva el menú a cualquier lugar fuera del titular del lugar del contenido y estará listo para continuar:

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