Получить индекс выбранного 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 ответа

Решение

Это даст вам CheckedRadioButton:

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----------

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