2016-10-28 3 views
1

Я хочу добавить обработчик в элемент управления, который я нахожу по его названию. Проблема в том, что это не представляется возможным дим элемент управления с помощью кнопки или RadioButton или что-то вроде этого ...Dimming Control by String и add handler

Dim control As Control = FindName(MyObject.Name.ToString) 
      AddHandler control.MouseEnter, Sub() 
               Try 
                Dim Tooltip As New ToolTip() 
                Tooltip.SetToolTip(control, control.Name.ToString) 
               Catch 

               End Try 

              End Sub 

В коде я мог бы затемнить контроль как кнопки, но затем, например, RadioButtons не работает. И я не хочу, чтобы иметь код, который всегда проверяет для OBJECTTYPE, а затем перейти в, если часть, как

If TypeName(MyObject).ToString = "Button" then 
... 
else if TypeName(MyObject).ToString = "Label" then 
... 
else if TypeName(MyObject).ToString = "RadioButton" then 
... 
End If 

Есть ли лучшее решение, то делать это таким образом?

E.g. что-то вроде

Dim Control as TypeName(MyObject).ToString = FindName(MyObject.Name.ToString) 
+0

Think вам нужно расширить немного, как я пытаюсь понять, что 'MyObject' есть. Это что-то, что вы заявили, или вы зацикливаете элементы управления? – Bugs

+0

Я перебираю элементы управления и получаю их детей до тех пор, пока не останется ни одного ребенка - затем перейдите к следующему .. и для каждого ребенка я хочу попытаться добавить этот обработчик –

+0

Подумайте, вам просто нужно обратиться к элементу управления. MouseEnter довольно стандартен для элементов управления. В вашем цикле 'Для каждого ctr As Control' поместите код' AddHandler ctr.MouseEnter'. Сделайте то же самое для дочерних элементов управления. Похоже, вы уже делаете это или близко к нему. Может потребоваться включить больше кода. – Bugs

ответ

1

Это вы после?

For Each ctr As Control In Me.Controls 
    AddHandler ctr.MouseEnter, Sub() 
            Try 
             Dim Tooltip As New ToolTip() 
             Tooltip.SetToolTip(ctr, ctr.Name.ToString) 
            Catch 

            End Try 
           End Sub 
Next 

Вы должны были бы расширить это к каждому ребенку, если вы циклически родительских объектов, таких как панели и т.д., но концепция должна работать.

EDIT:

Это должно работать для любого элемента управления, который имеет детей:

Объявите это в верхней части формы/класса:

Private _controls As New List(Of Control) 

Используйте это, чтобы добавить обработчик :

For Each ctr As Control In Me.Controls 
    AddHandler ctr.MouseEnter, Sub() 
            Try 
             Dim Tooltip As New ToolTip() 
             Tooltip.SetToolTip(ctr, ctr.Name.ToString) 
            Catch 

            End Try 
           End Sub 
    If ctr.HasChildren Then 
     _controls = New List(Of Control) 
     GetChildren(ctr) 
     For Each childCtr As Control In _controls 
      AddHandler childCtr.MouseEnter, Sub() 
               Try 
                Dim Tooltip As New ToolTip() 
                Tooltip.SetToolTip(childCtr, childCtr.Name.ToString) 
               Catch 

               End Try 
              End Sub 
     Next 
    End If 
Next 

И некоторые вещь, как это будет заполнить _controls список с дочерними элементами управления:

Private Sub GetChildren(ByVal container As Control) 

    For Each childCtr As Control In container.Controls 
     _controls.Add(childCtr) 
     If childCtr.HasChildren Then 
      GetChildren(childCtr) 
     End If 
    Next 

End Sub