Samuel Adam
Samuel Adam

Reputation: 1337

How to refer to an object by its name?

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

Answers (1)

Steven Doggart
Steven Doggart

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

Related Questions