Вы можете пометить каждую радио-кнопку уникальным тегом.

я есть приложение Windows Forms, в котором есть несколько кнопок RadioButton. Эти RadioButton размещены вFlowLayoutPanel который автоматически организует их для меня. Все RadioButton, которые непосредственно добавляются в FlowLayoutPanel, сгруппированы, то есть я могу выбрать только один из них. Тем не менее, некоторые из этих RadioButton связаны с TextBox, поэтому я могу привести некоторые аргументы там. Но чтобы все это было организовано должным образом, я добавляю элемент управления Panel в FlowLayoutPanel, чтобы я мог сам управлять выравниванием RadioButton и TextBox относительно друг друга.

Эти RadioButton теперь имеют свои собственные соответствующие панели в качестве родительских элементов управления и, следовательно, больше не включаются в группу радиосвязи с другими RadioButtons. Я прочитал, что RadioButtons, которые находятся вSystem.Web.UI пространства имен имеют свойство GroupName, но, к сожалению, ихSystem.Windows.Forms коллегам не хватает этого свойства. Есть ли какой-то другой способ, которым я могу сгруппировать эти переключатели, если я собираюсь обрабатывать события onClick самостоятельно?

Спасибо джерри

 Mahantesh07 янв. 2011 г., 17:01
Обычно мы используем групповое поле для группировки переключателей.

Ответы на вопрос(4)

создайте класс RadioGroup, который инкапсулирует функциональность группировки и добавляет поддержку стандартной навигации по клавиатуре (клавиши вверх / вниз) и обеспечивает работу табуляции.

Чтобы использовать его, просто объявите члена RadioGroup в своей форме и добавьте его (после InitializeComponent ()), передав все нужные переключатели в группе в правильном порядке.

public class RadioGroup
{
    List<RadioButton> _radioButtons;

    public RadioGroup(params RadioButton[] radioButtons)
    {
        _radioButtons = new List<RadioButton>(radioButtons);
        foreach (RadioButton radioButton in _radioButtons)
        {
            radioButton.TabStop = false;
            radioButton.KeyUp += new KeyEventHandler(radioButton_KeyUp);
            radioButton.CheckedChanged += new EventHandler(radioButton_CheckedChanged);
        }
        _radioButtons[0].TabStop = true;
    }

    void radioButton_KeyUp(object sender, KeyEventArgs e)
    {
        e.Handled = true;
        RadioButton radioButton = (RadioButton)sender;
        int index = _radioButtons.IndexOf(radioButton);

        if (e.KeyCode == Keys.Down)
        {
            index++;
            if (index >= _radioButtons.Count)
            {
                index = 0;
            }
            e.Handled = true;
        }
        else if (e.KeyCode == Keys.Up)
        {
            index--;
            if (index < 0)
            {
                index = _radioButtons.Count - 1;
            }
            e.Handled = true;
        }

        radioButton = _radioButtons[index];
        radioButton.Focus();
        radioButton.Select();
    }

    void radioButton_CheckedChanged(object sender, EventArgs e)
    {
        RadioButton currentRadioButton = (RadioButton)sender;

        if (currentRadioButton.Checked)
        {
            foreach (RadioButton radioButton in _radioButtons)
            {
                if (!radioButton.Equals(currentRadioButton))
                {
                    radioButton.Checked = false;
                }
            }
        }
    }
}

Одно предостережение: клавиши вверх / вниз не будут хорошо работать с существующим классом RadioButton, потому что он уже обрабатывает клавиши вверх / вниз. Один простой способ исправить это для подкласса RadioButton и отключить обработку клавиш вверх / вниз:

public class RadioButtonEx : RadioButton
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == Keys.Up || keyData == Keys.Down)
        {
            return true;
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
}

это (imho)

  private void FormLoad(object sender, EventArgs e)
  {
     radioCsv.Tag = DataTargetTypes.CsvFile;
     radioTabbed.Tag = DataTargetTypes.TxtFile;
     radioSas.Tag = DataTargetTypes.SasFile;
  }

  private void RadioButtonCheckedChanged(object sender, EventArgs e)
  {
     var radio = (RadioButton) sender;
     this.DataDestinationType = (DataTargetTypes)radio.Tag;
  }

@ Джерри, я не слишком знаком с Windows Forms, но сделаю снимок.ТегВы можете пометить каждую радио-кнопку уникальным тегом.

Решение Вопроса

вам придется справиться с этим вручную ... На самом деле это не так уж и плохо, вы можете просто сохранить все RadioButton в списке и использовать один обработчик событий для всех них:

private List<RadioButton> _radioButtonGroup = new List<RadioButton>();
private void radioButton_CheckedChanged(object sender, EventArgs e)
{
    RadioButton rb = (RadioButton)sender;
    if (rb.Checked)
    {
        foreach(RadioButton other in _radioButtonGroup)
        {
            if (other == rb)
            {
                continue;
            }
            other.Checked = false;
        }
    }
}
 parzival06 дек. 2011 г., 16:30
исправить: rb.Checked = false; => other.Checked = false;
 Jela12 янв. 2011 г., 09:38
Я боялся, что это будет так. Не должно быть проблемой, хотя. Спасибо за помощь.
 Thomas Levesque06 дек. 2011 г., 16:44
@maxirby, я не понимаю твой комментарий ... что ты имеешь в виду?

Ваш ответ на вопрос