0

Vb.Net の名前でオブジェクトを参照する方法はありますか?

たとえば、MenuA、MenuB、MenuC などの名前でデザイナーで作成されたメニュー項目があります。

データベースで、使用可能なすべてのメニューのリストを文字列形式で構成するテーブルを作成しました: MenuA、MenuB から MenuZ まで。

また、ユーザー権限、特定のユーザーがアクセスできるメニューからなる動的テーブルを作成しました。

そのため、アプリを起動すると、ログインしているユーザーに割り当てられたメニューの名前が取得され、Visible プロパティが TRUE に変わり始めます。

コントロールの場合は、 でループしますParent.Controls.Find(FoundMenu, True)。私の問題は、ほとんどがコントロールではなく、コントロールに追加されたアイテム、またはアイテムに追加された別のサブアイテムであることです。

では、名前だけで 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 に答える