В поисках лучшего решения - PullRequest
       54

В поисках лучшего решения

0 голосов
/ 29 сентября 2019

У меня есть следующий код.

Конечно, должен быть лучший способ кодирования этого с использованием for / next или чего-то еще, но я просто не заставляю его работать

    If CheckBox1.CheckState Then bin(1) = "1" Else bin(1) = "0"   
    If CheckBox2.CheckState Then bin(2) = "1" Else bin(2) = "0"
    If CheckBox3.CheckState Then bin(3) = "1" Else bin(3) = "0"
    ..
    ..
    ..
    If CheckBox20.CheckState Then bin(20) = "1" Else bin(20) = "0"

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

ОК, это должно работать, но имейте в виду, что предполагается, что у вас есть 20 CheckBoxes, и это число никогда не изменится, и что массив bin также никогда не изменит количество элементов.

Private Sub SyncCheckBoxestoBinValue()
    For i As Integer = 1 To 20
        bin(i) = Math.Abs(CInt(CType(Me.Controls("CheckBox" & i), CheckBox).Checked)).ToString
    Next
End Sub

Объяснение может быть здесь в порядке.Работа идет изнутри, здесь идет ..

Me.Controls("CheckBox" & i)

Это ищет в ваших элементах управления тот, который соответствует CheckBox1, когда i=1, CheckBox2, когда i=2 и т. Д.Однако, поскольку этот фрагмент кода предназначен для работы со всеми видами элементов управления, он может возвращать его только как тип объекта, а не как определенный тип элемента управления, который вы ищете.

Чтобы иметь возможность сделать что-то существенное с этим результатом, нам нужно сообщить компилятору, что это CheckBox.Так что теперь нам нужно обернуть этот последний бит кода в это.

CType(Me.Controls("CheckBox" & i), CheckBox)

Теперь у нас есть кое-что, что компилятор распознает как CheckBox, и мы можем работать с ним.Итак, вы хотите узнать из CheckBox is checked or not. You've used Checkstate , but personally I think it's a bit easier to use Checked` для этой цели.Итак ...

CType(Me.Controls("CheckBox" & i), CheckBox).Checked

Возвращает результат True или False.В VB.Net это также можно увидеть как -1 (истина) или 0 (ложь).хотя вы хотите 1 или 0, чтобы вы могли присвоить это значение вашему массиву bin.Как мы это делаем, как показано ниже:

Math.Abs(CInt(CType(Me.Controls("CheckBox" & i), CheckBox).Checked)).ToString

Наконец, ваш результат 1 или 0 присваивается элементу bin, который соответствует CheckBox числу

Это "должно" сделать это.

0 голосов
/ 29 сентября 2019

Может быть, сделать флажки списком и запросить результат по linq?Ради использования linq для всего лучшей читабельности, я имею в виду.

Dim cbList = New List(Of CheckBox) From {checkBox1, checkBox2, checkBox3}
Dim binTmp As List(Of String) = cbList.Select(Function(chk) If(chk.checkState, "1", "0")).ToList()
bin = binTmp

Вы также можете сохранить результат как Boolean вместо "1", "0"для дальнейшей обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...