Я подаю заявку на оценку школьного проекта, и мне интересно, как я могу просмотреть и проверить значение во всех полях со списком в определенной форме, у меня есть 19 единиц для проверки; пытаясь быть эффективным, не делая 19 case-операторов. Я пробовал массив и me.controls.

0
user5454571 11 Май 2016 в 17:05

4 ответа

Лучший ответ

Попробуй это :

For Each c As Control In Me.Controls.OfType(Of ComboBox)()
    'You cann acces to ComboBox her by c
Next
1
Abdellah OUMGHAR 11 Май 2016 в 14:12

Обратите внимание, что если у вас есть элементы управления, размещенные по контейнерам (TabControl, SPlitPanel и т. Д.), Вы можете не найти все свои элементы управления.

Вот рекурсивный вызов, который должен вернуть все ваши элементы управления:

Sub GetControlList(container As Control, ByVal ctlList As List(Of Control))
    For Each child As Control In container.Controls
        ctlList.Add(child)
        If (child.HasChildren) Then
            GetControlList(child, ctlList)
        End If
    Next
End Sub

Иногда у меня были проблемы с элементами управления на панелях SplitContainer, поэтому, если вы используете разделитель, убедитесь, что вы получаете все свои элементы управления.

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

Dim ctrls As New List(Of Control)
GetControlList(Me, ctrls)
For Each dgv As DataGridView In ctrls.OfType(Of DataGridView)()
    AddHandler dgv.DataError, AddressOf DataGridView_DataError
    Debug.Print(dgv.Name)
Next

К вашему сведению, общий код ошибки данных:

Private Sub DataGridView_DataError(sender As Object, e As DataGridViewDataErrorEventArgs)
    Dim dgv As DataGridView = sender
    Dim sGridName As String = dgv.Name.Replace("DataGridView", "")
    Dim col As DataGridViewColumn = dgv.Columns(e.ColumnIndex)
    Dim sColName As String = col.HeaderText
    MsgBox(sGridName & vbNewLine & "Column " & sColName & vbNewLine & e.Exception.Message, MsgBoxStyle.Exclamation)
End Sub
1
Joel Coehoorn 12 Май 2016 в 05:12

У вас уже есть метод OfType(OF T). Вы используете это так:

ForEach box As ComboBox In MyForm.Controls.OfType(Of ComboBox)()

Next

Но это проверяет только прямых дочерних элементов вашего управления. Если у вас есть элементы управления контейнера, такие как GroupBox, Panels, FlowControlLayoutPanel и т. Д., Вы пропустите элементы управления, вложенные в них. Но мы можем создать новый метод OfType() для рекурсивного поиска:

Public Module ControlExtensions
    <Extension()> 
    Public Iterator Function OfTypeRecursive(Of T As Control)(ByVal Controls As ControlCollection) As IEnumerable(Of T)
        For Each parent As Control In Controls
            If parent.HasChildren Then
                For Each child As Control In OfTypeRecursive(Of T)(parent.Controls)
                    Yield child
                Next child
            End If
        Next parent

        For Each item As Control In Controls.OfType(Of T)()
            Yield item
        Next item
    End Function
End Module

И вы используете его так же:

ForEach box As ComboBox In MyForm.Controls.OfTypeRecursive(Of ComboBox)()

Next
1
Joel Coehoorn 12 Май 2016 в 05:13

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

Private Function GetControls(Of T)(container As Control, searchChildren As Boolean) As T()
    Dim Controls As New List(Of T)

    For Each Child As Control In container.Controls
        If TypeOf Child Is T Then
            DirectCast(Controls, IList).Add(Child)
        End If

        If searchChildren AndAlso Child.HasChildren Then
            Controls.AddRange(GetControls(Of T)(Child, True))
        End If
    Next

    Return Controls.ToArray()
End Function

Вот пример использования: если search children имеет значение True, тогда все дочерние контейнеры будут искать элемент управления, который вы ищете. Кроме того, для самого верхнего контейнера мы просто передадим в Me, предполагая, что вы вызываете код из своей формы, в противном случае вы можете передать экземпляр формы или конкретную панель, GroupBox и т. Д.

Dim ComboBoxes As ComboBox() = GetControls(Of ComboBox)(Me, True)
0
Artail 12 Май 2016 в 04:07