Как упростить этот визуальный базовый код о переключателях и элементах управления нумерацией

У меня есть группа с элементом управления NumberUpDown, переключателями 0-10 на 1 и 11 (что соответствует диапазону элемента управления NumberUpDown). Мне удалось записать код в событиях элементов управления, чтобы при проверке переключателя значение NumberUpDown изменялось на значение переключателя, а при изменении значения NumberUpDown отмечался правильный переключатель.

Есть пользователи, которые хотят использовать стилус для нажатия на переключатели, а есть те, которые хотят использовать клавиатуру для ввода значений.

Ниже приведен код, который я написал. ДОЛГОЕ if/then/else должно быть написано по-другому. Казалось бы, RadioButtonArray (VB6) решит мою проблему, но это старая школа. Я просто недостаточно знаком с VB.NET, чтобы понять, как это сделать. Я использую Visual Studio 2010.

PainAcceptable является элементом управления NumberUpDown. PainAx отдельные радио кнопки.

Private Sub PainAcceptable_ValueChanged(sender As System.Object, e As System.EventArgs) Handles PainAcceptable.ValueChanged
    If PainAcceptable.Value = 0 Then
        PainA0.Checked = True
    ElseIf PainAcceptable.Value = 1 Then
        PainA1.Checked = True
    ElseIf PainAcceptable.Value = 2 Then
        PainA2.Checked = True
    ElseIf PainAcceptable.Value = 3 Then
        PainA3.Checked = True
    ElseIf PainAcceptable.Value = 4 Then
        PainA4.Checked = True
    ElseIf PainAcceptable.Value = 5 Then
        PainA5.Checked = True
    ElseIf PainAcceptable.Value = 6 Then
        PainA6.Checked = True
    ElseIf PainAcceptable.Value = 7 Then
        PainA7.Checked = True
    ElseIf PainAcceptable.Value = 8 Then
        PainA8.Checked = True
    ElseIf PainAcceptable.Value = 9 Then
        PainA9.Checked = True
    ElseIf PainAcceptable.Value = 10 Then
        PainA10.Checked = True
    End If
End Sub
' When radio button PainA1 is changed, PainAcceptable is set to the value 1
Private Sub PainA1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles PainA1.CheckedChanged
    If PainA1.Checked Then
        PainAcceptable.Value = 1
    End If
End Sub

2 ответа

Решение

Предположим, что мои радио названы rbPain## где ## - это A0, A1 ... A9. Мои радиостанции основаны на нуле. Так как радиоприемники в некотором роде нуждаются в групповом контроле, чтобы они действовали как группа, у меня есть все 10 (0 - 9) на групповом блоке или панели. Если вам не нравится внешний вид с пограничным стилем и т. Д. Наконец, на панели нет других элементов управления, кроме моего rbPains

Dim rbNameToFind as string = "rbPain"

rbNameToFind & = PainAcceptable.Value.ToString
' rbNameToFind now matches my rb names... "rbPain00" ... "rbPain09"

panel.Controls(rbNametoFind).Checked = True

Если вам нужно иметь некоторые другие элементы управления на панели, выполните итерацию по всем из них, чтобы найти каждый rbPain и тот, который назван тем, что вы ищете:

Dim rb as Radiobutton

For each ctl as Control in painPnl.Controls
  if ctl.GetType is GetType(radiobutton) then

       ' found an rb!
       if ctl.Name =  rbNameToFind Then
           rb = Ctype(ctl, gettype(radiobutton))
           ' found ours!
            rb.Checked = true
            exit for                   ' hurry home
       end if
   end if
 next

РЕДАКТИРОВАТЬ

Вы также можете упростить обработчик отмеченных изменений... вместо 10 из них:

 Private Sub PainA0_CheckedChanged(sender As System.Object, e As System.EventArgs) _ 
      Handles PainA1.CheckedChanged, PainA2.CheckedChanged, PainA3.CheckedChanged, _
              PainA4.CheckedChanged ... (you get the idea)

      ' I would not parse the name to get the value, but you could stash the 
      ' related value in .Tag where PainA0.Tag=1 or whatever.  1 line of code for
      ' all 10 RBs:

      PainAcceptable.Value = sender.Tag

      ' *** OR you could just move all the existing code to one sub basically:

      Dim Pain As Integer = 0
      Select Case sender.Name
          Case "PainA1"
              Pain = 1
          Case "PainA2"
              Pain = 2
          ...etc
      End Select
      PainAcceptable.Value = Pain

 End Sub

Другая проблема, с которой вы можете столкнуться - 2 элемента управления, меняющие одно значение. Когда они изменяют NumericUpDn, вы устанавливаете контрольное состояние Radio, которое вызывает событие CheckChanged, где вы устанавливаете значение NumericUpDn, где вы устанавливаете контрольное состояние, которое вызывает....

В этом случае он будет повторяться только один раз, потому что как только вы установите Value или CheckState, они фактически не изменятся во второй раз (это верно для NUD, не уверен в RB, но остановится, когда NUD фактически не изменится).

Наконец, 10 РБ - это много РБ. Вы могли бы сэкономить много времени и кода, если бы вместо этого использовали ComboBox. cboPain.SelectedIndex скажет вам, что вы хотите без каких-либо IF/Else или Select Case....

НТН

Другие вопросы по тегам