Получить индекс выбранного RadioButton в radioGroup
Я хочу найти индекс выбранного RadioButton в RadioGroup. Я прикрепил следующий метод к каждому RadioButton в группе:
private void radio_button_CheckedChanged(object sender, EventArgs e){
if (sender.GetType() != typeof(RadioButton)) return;
if (((RadioButton)sender).Checked){
int ndx = my_radio_group.Controls.IndexOf((Control)sender);
// change something based on the ndx
}
}
Для меня важно, чтобы более низкий RadioButton должен иметь более низкий индекс, начиная с нуля. И, кажется, это работает, но я не уверен, что это хорошее решение. Может быть, есть еще один способ сделать то же самое.
3 ответа
Это даст вам Checked
RadioButton
:
private void radioButtons_CheckedChanged(object sender, EventArgs e)
{
RadioButton rb = sender as RadioButton;
if (rb.Checked)
{
Console.WriteLine(rb.Text);
}
}
Любые индексы в коллекции Controls его Parent
очень изменчивы
Вы можете получить к нему доступ так: rb.Parent.Controls.IndexOf(rb)
Если вы хотите относительно стабильный идентификатор, кроме Name
и Text
Вы можете положить его в Tag
,
Очевидно, вам нужно подключить это событие ко всем RadionButtons
в группе.
Нет необходимости проверять тип (или рекомендовать imo), так как только RadioButton
может (или скорее: должен когда-либо) вызвать это событие.
В идеале, чтобы получить индекс, вы хотите, чтобы элементы управления были расположены как коллекция. Если вы можете добавить элементы управления из кода позади, это так же просто, как
List<RadionButton> _buttons = new List<RadioButton>();
_buttons.Add(new RadioButton() { ... });
_buttons.Add(new RadioButton() { ... });
...
Если вы хотите использовать разработанную форму, то, возможно, создание этого списка в конструкторе формы является альтернативой:
List<RadioButtons> _list = new List<RadioButton>();
public Form1()
{
InitializeComponent();
_list.Add(radioButton1);
_list.Add(radioButton2);
...
}
Тогда фактическая задача для получения индекса так же проста, как:
void radioButton_CheckedChanged(object sender, EventArgs e)
{
var index = _list.IndexOf(sender);
...
}
//----checked change----
private void radioButtons_CheckedChanged(object sender, EventArgs e)
{
int ndx = 0;
var buttons = RdoGroup.Controls.OfType<RadioButton>()
.FirstOrDefault(n => n.Checked);
//-----in initialize set radioButton tags : this.radioButton1.Tag = "1";------
if (buttons.Tag != null) ndx=Convert.ToInt32( buttons.Tag.ToString());
//--------do some thing by index----------
}