Reputation: 1337
Is there a possible way to refer an object through it's name in Vb.Net?
The case is, I have menu items created in my designer with names such as MenuA, MenuB and MenuC.
On the database, I created a table consisting the list of all available menus in string format : MenuA, MenuB all the way to MenuZ.
Also I created a dynamic table consisting the user permission, what menu is accessible by a certain user.
So when I started the app, it will get the name of menu assigned to the logged user, and start to turn the Visible property to TRUE.
If it was a Control, I would just loop through it by Parent.Controls.Find(FoundMenu, True)
.
My problem is most of it is not a control, it is an Item added to the Control, or even another SubItem added to the Item.
So how can I found an object in my UI only by it's name?
SearchQuery = "SELECT menu_name FROM tbl_menulist menu, tbl_user user WHERE menu.id_menu = user.id_menu"
QueryReader = ExecuteQueryReader(SearchQuery)
QueryReader.Read()
//What I'm looking for is something like Controls.Find method to look for an object by name
//Seems silly, but what I'm looking for is to create something like below
//QueryReader(0).ToString = Menu Name
Dim FoundMenu As Object = FindMenuByName(QueryReader(0).ToString)
FoundMenu.Visible = True
Anyone can help me with this, I would really appreciate any suggestions.
Thank you :)
Upvotes: 0
Views: 1855
Reputation: 43743
If this is a WinForm application, you can find the matching menu item by using a recursive method, such as:
Private Function findMenuItem(ByVal name As String, ByVal menuStrip As MenuStrip) As ToolStripMenuItem
Return findMenuItem(name, menuStrip.Items)
End Function
Private Function findMenuItem(ByVal name As String, ByVal menuItems As IEnumerable(Of ToolStripItem)) As ToolStripMenuItem
Dim foundItem As ToolStripMenuItem = Nothing
For Each i As ToolStripMenuItem In menuItems.OfType(Of ToolStripMenuItem)()
If i.Name = name Then
foundItem = i
Exit For
Else
foundItem = findMenuItem(name, i.DropDownItems)
If foundItem IsNot Nothing Then
Exit For
End If
End If
Next
Return foundItem
End Function
Then, you can use it like this (where MenuStrip1 is the name of your top level menu strip):
Dim menuItem As ToolStripMenuItem = findMenuItem(QueryReader(0).ToString, MenuStrip1)
Upvotes: 1