Hi,
I am still new to VB and ASP.NET so maybe one of the pros can help me out. I have a horizontal MainMenu and another horizontal SubMenu directly under it.
I am loading these from a database into a MenuCollection Session variable which is a Dictionary of the SubMenu and it's ParentId.
When the user clicks a MainMenu item I want to swap in and display the correct SubMenu.
When the `MainMenu.ItemClick` event happens the postback occurs and then I try to put the correct menu from the Dictionary into the SubMenu but it doesn't show.
Do I need another postback for the SubMenu to load or need to do some javascript? Or am I going about this the wrong way?
Also, am I using the Session variables correctly to store the MenuCollection and MenuData so I can use them later?
Below is my code. The "ASPxMenu"s are DevExpress controls.
Thanks.
Imports System.Data Imports System.Data.SqlClient Imports DevExpress.Web.ASPxMenu Imports System.Collections.Generic Public Class RootMaster Inherits System.Web.UI.MasterPage Private ReadOnly connection As String = System.Configuration.ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then Session("MenuData") = GetMenuData() AddTopMenuItems(Session("MenuData")) End If End Sub Private Function GetMenuData() As DataTable Using con As New SqlConnection(connection) Dim cmd As New SqlCommand("Select * from MenuData", con) Dim dtMenuItems As New DataTable() Dim sda As New SqlDataAdapter(cmd) sda.Fill(dtMenuItems) cmd.Dispose() sda.Dispose() Return dtMenuItems End Using End Function Private Sub AddTopMenuItems(menuData As DataTable) Dim view As DataView = Nothing Dim MenuDictionary As New Dictionary(Of Integer, ASPxMenu) view = New DataView(menuData) view.RowFilter = "ParentId IS NULL" For Each row As DataRowView In view 'Adding the menu item If row("IsActive") Then Dim RowId As Integer = row("Id") Dim newMenuItem As New MenuItem(row("Text").ToString(), RowId.ToString()) MainMenu.Items.Add(newMenuItem) 'Create all sub menus for each main menu item, add to dictionary Dim SubM = CreateSubMenus(menuData, newMenuItem) If SubM.Items.Count > 0 Then MenuDictionary.Add(RowId, SubM) End If End If Next Session("MenuCollection") = MenuDictionary MainMenu.Items(0).Selected = True view = Nothing End Sub Private Function CreateSubMenus(menuData As DataTable, parentMenuItem As MenuItem) As ASPxMenu Dim view As DataView = Nothing Dim Result As New ASPxMenu view = New DataView(menuData) view.RowFilter = "ParentId=" & parentMenuItem.Name For Each row As DataRowView In view If row("IsActive") Then Dim newMenuItem As New MenuItem(row("Text").ToString(), row("Id").ToString()) Result.Items.Add(newMenuItem) End If Next Return Result End Function Protected Sub MainMenu_ItemClick(source As Object, e As DevExpress.Web.ASPxMenu.MenuItemEventArgs) Handles MainMenu.ItemClick If Not Session("MenuCollection") Is Nothing Then Dim MenuDictionary As Dictionary(Of Integer, ASPxMenu) = DirectCast(Session("MenuCollection"), Dictionary(Of Integer, ASPxMenu)) If MenuDictionary.ContainsKey(e.Item.Name) Then SubMenu = MenuDictionary.Item(e.Item.Name) End If End If End Sub End Class