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
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.
Private Sub MDIParent1_Load(ByVal sender As Object,
ByVal e As System.EventArgs) Handles Me.Load
Dim Conn As New Conn1
Dim mnRd As SqlClient.SqlDataReader
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.
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
".
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
:
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