Группировка форм Windows Radiobuttons с различными родительскими элементами управления в С#
У меня есть приложение Windows Forms, в котором у меня есть несколько RadioButtons. Эти RadioButtons помещаются в FlowLayoutPanel, который автоматически упорядочивает их для меня. Все RadioButtons, которые напрямую добавляются в FlowLayoutPanel, сгруппированы, что означает, что я могу выбрать только один из них. Однако некоторые из этих RadioButtons объединены с TextBox, поэтому я могу предоставить там какой-либо аргумент. Но чтобы все это было правильно организовано, я добавляю элемент управления Panel в FlowLayoutPanel, чтобы я мог контролировать выравнивание RadioButton и TextBox относительно друг друга самостоятельно.
Эти RadioButtons теперь имеют свои собственные панели в качестве родительских элементов управления и, следовательно, больше не включены в группу радиостанций с другими RadioButtons. Я читал, что RadioButtons, которые находятся в пространстве имен System.Web.UI, имеют свойство GroupName, но, к сожалению, их копии System.Windows.Forms не имеют этого свойства. Есть ли другой способ, которым я могу сгруппировать эти переключатели, мне придется обрабатывать события onClick самостоятельно?
Спасибо,
Джерри
Ответы
Ответ 1
Я боюсь, вам придется обрабатывать это вручную... На самом деле это не так уж плохо, вы можете просто сохранить все 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;
}
}
}
Ответ 2
Я согласен с @JonH - использование тегов - самый чистый способ сделать это (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;
}
Ответ 3
@Джерри, я не слишком хорошо знаком с Windows Forms, но я сделаю снимок. Если есть свойство Tag, вы можете пометить каждый переключатель с помощью уникального тега.
Ответ 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);
}
}
Ответ 5
Я попал на ваш вопрос после поиска в Google моей аналогичной проблемы. Оказывается, используя GroupBox или Panel, вы можете легко сгруппировать переключатель. Итак, я поместил свои элементы управления под эти элементы управления группированием, а затем использовал Rows Span и Columns Span для TableLayoutPanel. Это сработало для меня.
![Column Spanned]()
Кроме того, вот ссылка на Как пролистать строки и столбцы