0

有没有一种可能的方法通过它在 Vb.Net 中的名称来引用一个对象?

情况是,我在我的设计器中创建了菜单项,其名称为 MenuA、MenuB 和 MenuC。

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

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

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

如果它是一个控件,我将通过Parent.Controls.Find(FoundMenu, True). 我的问题是大部分不是控件,是控件中添加的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

任何人都可以帮助我,我非常感谢任何建议。

谢谢 :)

4

1 回答 1

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)
于 2012-06-18T19:14:14.517 回答