Как пройтись по элементам управления вкладками и проверить наличие меток? - PullRequest
0 голосов
/ 06 июля 2019

В моей форме у меня есть tabcontrol с 12 вкладками.Каждая вкладка содержит много ярлыков.72 из них содержат числовые данные в свойстве .text, которое равно либо "0", "", либо "x", где x - это числовое значение данных в виде строки.Остальные метки на странице предназначены для форматирования ... то есть backcolor = color.black и используются как форма линии.Эти ярлыки .text - это ""

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

Следующее является ключом к пониманию того, почемуЯ делаю это: свойство .textchanged меток ABC запускает математические функции и возвращает результат меткам DE F. И свойство .textchanged меток DEF запускает математические функции и возвращает результат меткам GH I.

Математика - это деление, поэтому, если все метки еще не заполнены, а событие .textchanged срабатывает, математика вызовет деление на ноль ошибок.

Итак, я установил флаг для каждой функции if iAmLoaded = true, чтобысрабатывает только после того, как форма закончила заполнять метки.

Теперь, когда форма загружается, и все значения возвращаются в метки ... Мне нужно вызвать событие .textchanged на каждой метке, которую.text свойство <> "0" или <> ""

Моя идея состоит в том, чтобы перебрать значение в каждой метке, содержащей значение, на 1, а затем вычесть это 1 обратно из него.

    iAmLoaded = True
    Dim i = 0

    For Each LabelOnTheForm As Label In TabControl1.TabPages(i).Controls
        'The problem is at the second iteration of the for loop, it has a button instead of a label
        'How do I design a "If" statement to test if the control I am working with is a label and not a button
        If LabelOnTheForm = Label Then '<--- produces error 'Label' is a class type and cannot be used as an expression
            If DirectCast(LabelOnTheForm, Label).Text <> "" And DirectCast(LabelOnTheForm, Label).Text <> "0" Then
                DirectCast(LabelOnTheForm, Label).Text = (Convert.ToDouble(DirectCast(LabelOnTheForm, Label).Text) + 1).ToString
                DirectCast(LabelOnTheForm, Label).Text = (Convert.ToDouble(DirectCast(LabelOnTheForm, Label).Text) - 1).ToString
                i = i + 1
            Else
                i = i + 1
            End If
        End If
    Next

End Sub

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Использование предложения Ганса для упрощения:

    iAmLoaded = True
    Dim i = 0
    Dim test As String
    Do While i <> 12
        For Each LabelOnTheForm As Label In TabControl1.TabPages(i).Controls.OfType(Of Label)()
            Dim lbl = DirectCast(LabelOnTheForm, Label)
            test = NumFormat(lbl.Text)
            If test = lbl.Text And
                    lbl.Text <> "" And lbl.Text <> "0" Then
                lbl.Text = (Convert.ToDouble(lbl.Text) + 1).ToString
                lbl.Text = (Convert.ToDouble(lbl.Text) - 1).ToString
            End If

        Next
        i = i + 1
    Loop
End Sub

Проблема в том, что я вернулся на круги своя: Как только метки загружены со своими значениями ... Приведенный выше код будет перебирать и вычитать по одному из каждого значения, чтобы вызвать событие .textchanged, однако, поскольку он извлекает метки случайным образом ... он обновил одну из меток, которая нуждалась в данных из предыдущей метки в моей логике, но цикл for в приведенном выше примере вытягивает метки случайным образом. Есть ли способ для меня, чтобы установить порядок, чтобы он вытягивал ярлыки с формы?

0 голосов
/ 06 июля 2019

Спасибо, Стив ... Ответ:

    iAmLoaded = True
    Dim i = 0

    Do While i <> 12
        For Each LabelOnTheForm As Label In TabControl1.TabPages(i).Controls.OfType(Of Label)()

            If DirectCast(LabelOnTheForm, Label).Text <> "" And DirectCast(LabelOnTheForm, Label).Text <> "0" Then
                DirectCast(LabelOnTheForm, Label).Text = (Convert.ToDouble(DirectCast(LabelOnTheForm, Label).Text) + 1).ToString
                DirectCast(LabelOnTheForm, Label).Text = (Convert.ToDouble(DirectCast(LabelOnTheForm, Label).Text) - 1).ToString
            End If

        Next

        i = i + 1

    Loop
...