Click here to Skip to main content
15,867,308 members
Articles / Programming Languages / Visual Basic
Article

Dynamic Creation Of MenuStrip - VB.NET

Rate me:
Please Sign up or sign in to vote.
3.96/5 (15 votes)
23 Aug 2008CPOL1 min read 232.4K   9.7K   64   50
Implementing Menustrip dynamically from database, the menu names and order will be through backend.

Introduction

I came up with the problem of creating an application that was driven according to user rights. I thought of implementing the menus to be driven through BackEnd. All the menu names and the form (formname) to open when the child menu was clicked, come from the table. To implement menus, I used MenuStrip from VB.NET.

Sample Code

Image 1

Using the Code

It executes during the Form Load and populates all the menu headers. All data comes from the backend and there is nothing to hardcode. I have attached the structure of two tables MENUMASTER and ACCESS below.

The code below will have a variable like iUserAccessMode, which in turn tells us about the user access level (Look into the Excel sheet which has been attached and look into the Access Tab in the Excel sheet). The Menus will be loaded according to User Access Level.

VB.NET
Private Sub MDIParent1_Load(ByVal sender As Object,
       ByVal e As System.EventArgs) Handles Me.Load
       'On Error GoTo ErrHandler
'Create a Connection class, that has the full features of working with Backend.
'See article for Connection class :  Connection_Class.asp

       Dim Conn As New Conn1
       Dim mnRd As SqlClient.SqlDataReader
'It helps in populating the MENUs according to user rights. From the Table "Access"
       iUserAccessMode = GlobalValues.lblUsrAccess.Text
       sQry = ""
       sQry = "Select MenuText from MenuMaster Where MainMenuID = 0" & _
              " And MenuID in (Select MenuID from Access Where AccessId =
               " & CInt(iUserAccessMode) & ")" & _
               " And isActive = 1"
       mnRd = Conn.ReaderData(sQry)

If mnRd.HasRows Then
           mnMenu = New MenuStrip
           While mnRd.Read
               mnMenu.Items.Add(mnRd(0).ToString, Nothing, New System.EventHandler(
                   AddressOf MainMenu_OnClick))
               Me.Controls.Add(mnMenu)
           End While
       End If

mnRd.Close()
   End Sub

This function creates child menus when the parent menu is created.

VB.NET
Private Sub MainMenu_OnClick(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim cms As New ContextMenuStrip()
        Dim sMenu() As String
        Dim Conn As New Conn1
        Dim sMenuRD As SqlClient.SqlDataReader
        sQry = ""
        sQry = "Select MenuID from MenuMaster Where MenuText = '" & sender.ToString & "'"
        sMenuRD = Conn.ReaderData(sQry)
        Dim parentMenuID As Integer
        If sMenuRD.HasRows Then
            sMenuRD.Read()
            parentMenuID = sMenuRD("MenuID")
        End If
        sMenuRD.Close()
        sQry = ""
        sQry = "Select MenuText from MenuMaster Where MainMenuID =
               '" & parentMenuID & "'" & _
               " And isActive = 1" & _
               " And MenuID in (
                   Select MenuID from Access Where AccessId =
                   " & CInt(iUserAccessMode) & ")" & _
               " Order BY MenuOrder"
        sMenuRD = Conn.ReaderData(sQry)
        ReDim Preserve sMenu(0)
        Dim i As Integer
        If sMenuRD.HasRows Then
            ReDim Preserve sMenu(0)
            i = 0
            While sMenuRD.Read()
                ReDim Preserve sMenu(i)
                sMenu(i) = sMenuRD("MenuText")
                i = i + 1
            End While
        End If
        sMenuRD.Close()
        For Each sMn As String In sMenu
            cms.Items.Add(sMn, Nothing,
                New System.EventHandler(AddressOf SelectedChildMenu_OnClick))
        Next
        Dim tsi As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
        tsi.DropDown = cms
    End Sub

This function is executed at the click event of each menu item, the form to open(FormName) on the execution of the event also comes from the backend table "MENUMASTER".

VB.NET
Private Sub SelectedChildMenu_OnClick(ByVal sender As Object,
    ByVal e As System.EventArgs)
    Dim Conn As New Conn1
    Dim sMenuRD As SqlClient.SqlDataReader
    Dim frmName As String = ""
    Dim frm As New Form
    sQry = ""
    sQry = "Select FormName from MenuMaster Where MenuText = '" &
        sender.ToString & "'"
    sMenuRD = Conn.ReaderData(sQry)
    If sMenuRD.HasRows Then
        sMenuRD.Read()
        frmName = sMenuRD(0).ToString
        DynamicallyLoadedObject(frmName).Show(Me)
    Else
        MsgBox("Under Construction", MsgBoxStyle.Exclamation, "Technical Error")
    End If
    sMenuRD.Close()
End Sub

Points of Interest

I came up with the problem of converting the formname which I get from SQL as string to FORM object. This function helps in converting the string object formName, which is returned from SQL into object of type Form:

VB.NET
Private Function DynamicallyLoadedObject(ByVal objectName As String,
    Optional ByVal args() As Object = Nothing) As Form
    Dim returnObj As Object = Nothing
    Dim Type As Type = Assembly.GetExecutingAssembly().GetType(
        "[YOUR PROJECT NAME]." & objectName)
    If Type IsNot Nothing Then
        returnObj = Activator.CreateInstance(Type, args)
    End If
    Return returnObj
End Function

History

  • 17th June, 2007: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralRe: Problem in SelectedchildMenu_OnClick event Pin
Arul Soosai14-Apr-09 22:00
Arul Soosai14-Apr-09 22:00 
GeneralRe: Problem in SelectedchildMenu_OnClick event Pin
Bad Programmer18-Apr-09 18:27
Bad Programmer18-Apr-09 18:27 
GeneralRe: Problem in DynamicallyLoadedObject() Pin
Alicealiciasawarak28-Mar-11 18:38
Alicealiciasawarak28-Mar-11 18:38 
GeneralRe: Problem in DynamicallyLoadedObject() Pin
Alicealiciasawarak30-Mar-11 20:55
Alicealiciasawarak30-Mar-11 20:55 
GeneralRe: Problem in DynamicallyLoadedObject() Pin
John lenon Hurtado Filipes 20235-May-23 14:44
John lenon Hurtado Filipes 20235-May-23 14:44 
QuestionDynamic Creation of MenuStrip- C#.net [modified] Pin
Shahid K5-Mar-09 1:24
Shahid K5-Mar-09 1:24 
GeneralResult listed by vertical, not horizontal Pin
Hendra Prasetyo15-Jan-09 16:59
Hendra Prasetyo15-Jan-09 16:59 
AnswerRe: Result listed by vertical, not horizontal Pin
Bad Programmer15-Jan-09 20:51
Bad Programmer15-Jan-09 20:51 
Hi,

Do this,

Set the MainMenuID of Purchase to User's MenuID
Revert if it still creates problem

Thanks

Bad Programmer

Generalopen dynamic form in MDI window Pin
Mithuya4-Nov-08 8:05
Mithuya4-Nov-08 8:05 
GeneralRe: open dynamic form in MDI window Pin
Bad Programmer5-Nov-08 1:13
Bad Programmer5-Nov-08 1:13 
GeneralRe: open dynamic form in MDI window Pin
Mark Denson16-Nov-09 7:01
Mark Denson16-Nov-09 7:01 
GeneralRe: open dynamic form in MDI window Pin
Finder11511-Jun-11 21:10
Finder11511-Jun-11 21:10 
GeneralRe: open dynamic form in MDI window Pin
Finder11511-Jun-11 20:51
Finder11511-Jun-11 20:51 
GeneralExcelent Pin
lefaconi25-Oct-08 5:06
lefaconi25-Oct-08 5:06 
GeneralRe: Excelent Pin
Mithuya4-Nov-08 8:04
Mithuya4-Nov-08 8:04 
GeneralSimple superb Pin
Ashutosh Phoujdar26-Aug-08 20:43
Ashutosh Phoujdar26-Aug-08 20:43 
GeneralDownload code Pin
bkresimir25-Feb-08 19:30
bkresimir25-Feb-08 19:30 
QuestionHacking Access database Pin
Gyanendra kumar thakur29-Jun-07 19:07
Gyanendra kumar thakur29-Jun-07 19:07 
AnswerRe: Hacking Access database Pin
Bad Programmer30-Jun-07 9:43
Bad Programmer30-Jun-07 9:43 
QuestionUse the 'new' keyword to create an object instance. Pin
keonj26-Jun-07 12:00
keonj26-Jun-07 12:00 
AnswerRe: Use the 'new' keyword to create an object instance. Pin
Bad Programmer30-Jun-07 11:17
Bad Programmer30-Jun-07 11:17 
GeneralRe: Use the 'new' keyword to create an object instance. Pin
Dustin Klinkenberg20-Aug-08 7:53
Dustin Klinkenberg20-Aug-08 7:53 
GeneralRe: Use the 'new' keyword to create an object instance. Pin
Alicealiciasawarak28-Mar-11 19:00
Alicealiciasawarak28-Mar-11 19:00 
GeneralCreate a Connection class Pin
GeertD19-Jun-07 0:52
GeertD19-Jun-07 0:52 
GeneralRe: Create a Connection class Pin
Bad Programmer5-Nov-08 1:22
Bad Programmer5-Nov-08 1:22 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.