Как упростить этот визуальный базовый код о переключателях и элементах управления нумерацией
У меня есть группа с элементом управления 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....
НТН
Попробуй использовать Controls.Find
для получения нужного переключателя:
Найти элемент управления по имени в элементах управления Windows Forms