2015-06-04 4 views
0

Я пытаюсь перечислить все элементы управления в форме, которые удовлетворяют определенное условие, как код beelowПеречислить все элементы управления в форме (избыточно)

Public Enum MethodSeachEnum 
    StartsWith = 1 
    EndsWith = 2 
    Contains = 3 
End Enum 

Public Function GetAllControls(Control As Control, Key As String, MethodSeach As MethodSeachEnum, ControlType As Type, Optional UseTag As Boolean = True) As IEnumerable(Of Control) 
    Dim controls = Control.Controls.Cast(Of Control)() 

    Return (controls.SelectMany(Function(ctrl) GetAllControls(ctrl, Metodo)).Concat(controls).Where(Function(c) 
      Select Case MethodSeach 
       Case MetodoSeachEnum.EndsWith 
        If (UseTag) Then 
         Return c.Tag.ToString.ToUpper.EndsWith(Key.ToUpper) And c.GetType() Is ControlType 
        Else 
         Return c.Name.ToUpper.EndsWith(Key.ToUpper) And c.GetType() Is ControlType 
        End If 
       Case MetodoSeachEnum.StartsWith 
        If (UseTag) Then 
         Return c.Tag.ToString.ToUpper.StartsWith(Key.ToUpper) And c.GetType() Is ControlType 
        Else 
         Return c.Name.ToUpper.StartsWith(Key.ToUpper) And c.GetType() Is ControlType 
        End If 
       Case MetodoSeachEnum.Contains 
        If (UseTag) Then 
         Return c.Tag.ToString.ToUpper.Contains(Key.ToUpper) And c.GetType() Is ControlType 
        Else 
         Return c.Name.ToUpper.Contains(Key.ToUpper) And c.GetType() Is ControlType 
        End If 
       Case Else 
        Return False 
      End Select 
     End Function)) 
End Function 

Внутри моей формы есть GroupBox и внутри, что некоторые TextBox. Эти TextBox не возвращаются, и я не понимая, почему ...

Вот как я называю эту функцию

Dim ctrls = GetAllControls(FormTagliente, "txtQuote", MetodoSeachEnum.StartsWith, GetType(TextBox), False) 

     For Each txt As TextBox In ctrls 

      ... 

     Next 
+3

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

+0

controls.SelectMany (функция (ctrl) GetAllControls (ctrl, MethodSeach) ... это избыточный вызов функции GetAllControls() – BossOz

ответ

1

Существует ИМХО слишком мало информации, чтобы ответить на ваш вопрос «почему это не работает для ваш конкретный случай «
Также в вашем коде отсутствует GetAllControls с двумя аргументами, возможно, проблема там
В любом случае я немного поиграл с вашим кодом (но не проверял его, чтобы он был скорее POC), и вот что я получил :

Enum SearchMethod 
    StartsWith = 1 
    EndsWith = 2 
    Contains = 3 
End Enum 

Function GetAllControls(Of T As Control)(ctrl As Control, key As String, method As SearchMethod, Optional useTag As Boolean = True) As IEnumerable(Of T) 
    ' TODO validate args 
    Dim upperKey = key.ToUpper 

    Dim searchPredicates() As Func(Of String, Boolean) = { 
     Function(src, tgt) src.StartsWith(upperKey), 
     Function(src, tgt) src.EndsWith(upperKey), 
     Function(src, tgt) src.Contains(upperKey) 
    } 
    Dim ctrlSelector As Func(Of Control, String) = If(useTag, Function(c) c.Tag.ToString.ToUpper, Function(c) c.Name.ToUpper) 

    Return GetAllControlsIterator(Of T)(ctrl, ctrlSelector, searchPredicates(CInt(method) - 1)) 
End Function 

Private Iterator Function GetAllControlsIterator(Of T As Control)(ctrl As Control, ctrlSelector As Func(Of Control, String), searchPredicate As Func(Of String, Boolean)) As IEnumerable(Of T) 
    For Each child In ctrl.Controls 
     If searchPredicate(ctrlSelector(child)) AndAlso TypeOf child Is T Then Yield DirectCast(child, T) 

     For Each grandChild In GetAllControlsIterator(Of T)(child, ctrlSelector, searchPredicate) 
      Yield DirectCast(grandChild, T) 
     Next 
    Next 
End Function 

Идея заключалась в том, чтобы разделить «построить логику критериев» на фактический «цикл, поиск, выход», используя общее ограничение, чтобы заставить targetType быть элементом управления (и иметь непосредственно «хороший» тип возврата) , Я также нахожу более простым использование блока Iterator, но это более похожее
Возможно, это могло бы помочь вам решить вашу проблему?

Смежные вопросы