如何通过名称引用对象?

时间:2012-06-18 18:26:07

标签: vb.net vb.net-2010

是否有可能通过Vb.Net中的名称引用对象?

案例是,我在设计师中创建了菜单项,其名称包括MenuA,MenuB和MenuC。

在数据库上,我创建了一个表,其中包含字符串格式的所有可用菜单列表:MenuA,MenuB一直到MenuZ。

我还创建了一个包含用户权限的动态表,某个用户可以访问哪个菜单。

因此,当我启动应用程序时,它将获得分配给已登录用户的菜单名称,并开始将Visible属性设置为TRUE。

如果它是一个控件,我只需通过Parent.Controls.Find(FoundMenu, True)循环它。 我的问题是大多数它不是一个控件,它是一个添加到Control中的Item,或者是另一个添加到Item中的SubItem。

那么如何才能在我的UI中找到一个只有它名字的对象?

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

任何人都可以帮助我,我真的很感激任何建议。

谢谢:)

1 个答案:

答案 0 :(得分:1)

如果这是一个WinForm应用程序,您可以使用递归方法找到匹配的菜单项,例如:

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

然后,您可以像这样使用它(其中MenuStrip1是顶级菜单条的名称):

Dim menuItem As ToolStripMenuItem = findMenuItem(QueryReader(0).ToString, MenuStrip1)