С# WinForms Радио кнопки
Я загрузил 4 кнопки радиоприемника, и когда я запускаю программу и нажимаю на нее, если я нажму один, и нажмите другую, остальные уйдут. Что, если бы я хотел, чтобы у меня были две радиокнопки, но они делали разные вещи?
Ответы
Ответ 1
Группируйте различные наборы выбора в отдельных групповых ящиках (или панелях или других элементах управления контейнерами, но групповые поля, вероятно, вы после этого).
MSDN:
Элементы управления Windows Forms RadioButton предназначены для предоставления пользователям выбора между двумя или более настройками, из которых только один может быть назначен процедуре или объекту. Например, группа элементов управления RadioButton может отображать выбор носителей пакетов для заказа, но будет использоваться только одна из несущих. Поэтому можно выбрать только один RadioButton за один раз, даже если он является частью функциональной группы.
Вы группируете переключатели, рисуя их внутри контейнера, например, панели управления, элемента управления GroupBox или формы.
Это предполагает, что у вас есть четыре или более переключателей на вашей форме. Если у вас есть только два, скажем, и вы хотите разрешить пользователю возможность выбора обоих, используйте набор флажков.
Ответ 2
Вы должны использовать элемент управления GroupBox.
Все переключатели в GroupBox являются взаимоисключающими - поместите 2 переключателя в один GroupBox, а остальные 2 в другой GroupBox.
Если вам не нравится, чтобы ваш контейнер был видимым, используйте Panel control вместо GroupBox.
(Просто перетащить)
![alt text]()
Как вы, вероятно, можете догадаться, верхний - это GroupBox, нижний (который невидим, но позволяет выбрать только один readioButton внутри него) - панель.
НТН.
Ответ 3
Попробуйте разместить аналогичные параметры в контейнере, например GroupBox
Ответ 4
Обычно группа переключателей используется, когда применяется только одна опция. Если допустимо одновременно выбирать несколько параметров, вместо этого используйте флажки.
Ответ 5
Мне нравится концепция группировки RadioButtons в WPF. Существует свойство GroupName
, которое указывает, какие элементы управления RadioButton являются взаимоисключающими (http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx).
Итак, я написал производный класс для WinForms, который поддерживает эту функцию:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Windows.Forms.VisualStyles;
using System.Drawing;
using System.ComponentModel;
namespace Use.your.own
{
public class AdvancedRadioButton : CheckBox
{
public enum Level { Parent, Form };
[Category("AdvancedRadioButton"),
Description("Gets or sets the level that specifies which RadioButton controls are affected."),
DefaultValue(Level.Parent)]
public Level GroupNameLevel { get; set; }
[Category("AdvancedRadioButton"),
Description("Gets or sets the name that specifies which RadioButton controls are mutually exclusive.")]
public string GroupName { get; set; }
protected override void OnCheckedChanged(EventArgs e)
{
base.OnCheckedChanged(e);
if (Checked)
{
var arbControls = (dynamic)null;
switch (GroupNameLevel)
{
case Level.Parent:
if (this.Parent != null)
arbControls = GetAll(this.Parent, typeof(AdvancedRadioButton));
break;
case Level.Form:
Form form = this.FindForm();
if (form != null)
arbControls = GetAll(this.FindForm(), typeof(AdvancedRadioButton));
break;
}
if (arbControls != null)
foreach (Control control in arbControls)
if (control != this &&
(control as AdvancedRadioButton).GroupName == this.GroupName)
(control as AdvancedRadioButton).Checked = false;
}
}
protected override void OnClick(EventArgs e)
{
if (!Checked)
base.OnClick(e);
}
protected override void OnPaint(PaintEventArgs pevent)
{
CheckBoxRenderer.DrawParentBackground(pevent.Graphics, pevent.ClipRectangle, this);
RadioButtonState radioButtonState;
if (Checked)
{
radioButtonState = RadioButtonState.CheckedNormal;
if (Focused)
radioButtonState = RadioButtonState.CheckedHot;
if (!Enabled)
radioButtonState = RadioButtonState.CheckedDisabled;
}
else
{
radioButtonState = RadioButtonState.UncheckedNormal;
if (Focused)
radioButtonState = RadioButtonState.UncheckedHot;
if (!Enabled)
radioButtonState = RadioButtonState.UncheckedDisabled;
}
Size glyphSize = RadioButtonRenderer.GetGlyphSize(pevent.Graphics, radioButtonState);
Rectangle rect = pevent.ClipRectangle;
rect.Width -= glyphSize.Width;
rect.Location = new Point(rect.Left + glyphSize.Width, rect.Top);
RadioButtonRenderer.DrawRadioButton(pevent.Graphics, new System.Drawing.Point(0, rect.Height / 2 - glyphSize.Height / 2), rect, this.Text, this.Font, this.Focused, radioButtonState);
}
private IEnumerable<Control> GetAll(Control control, Type type)
{
var controls = control.Controls.Cast<Control>();
return controls.SelectMany(ctrl => GetAll(ctrl, type))
.Concat(controls)
.Where(c => c.GetType() == type);
}
}
}
Ответ 6
Поместите все радиокнопки в поле группы.
Теперь на всех свойствах переключателя установите Auto Check
на false
.
В качестве альтернативы вы можете установить
radioButton1->AutoCheck = false;
Внутри функции radioButton1_Click
обрабатывайте по мере необходимости. Пример:
Void radioButton1_Click(Object^ sender, EventArgs^ e) {
radioButton1->Enabled = true;
radioButton2->Enabled = true;
radioButton3->Enabled = true;
radioButton1->Checked = true;
radioButton2->Checked = true;
radioButton3->Checked = true;
}
Это должно сделать эти выбранные переключатели для проверки.