2012-06-18 3 views
0

Есть ли способ передать объект через его имя в Vb.Net?Как обратиться к объекту по его названию?

Дело в том, что у меня есть пункты меню, созданные в моем дизайнере с такими именами, как MenuA, MenuB и MenuC.

В базе данных я создал таблицу, состоящую из списка всех доступных меню в строчном формате: MenuA, MenuB до MenuZ.

Также я создал динамическую таблицу, состоящую из пользовательского разрешения, какое меню доступно для определенного пользователя.

Итак, когда я запустил приложение, он получит имя меню, назначенное зарегистрированному пользователю, и начнет превращать свойство Visible в значение TRUE.

Если бы это был элемент управления, я бы просто пропустил его через Parent.Controls.Find(FoundMenu, True). Моя проблема заключается в том, что это не элемент управления, это элемент, добавленный в элемент управления, или еще один дополнительный элемент, добавленный к элементу.

Итак, как я могу найти объект в своем интерфейсе только по его названию?

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 

Любой может мне помочь в этом, я был бы очень признателен за любые предложения.

Спасибо :)

+0

Это приложение WinForm? –

ответ

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) 
+0

Спасибо SteveDog! Вы уверены, что это очень полезно! –

+0

спасибо человеку, я забыл добавить и –

+0

Как пропустить разделители элементов меню этим кодом? –