¿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>