it-swarm.com.ru

Какой переключатель в группе отмечен?

Использование WinForms; Есть ли лучший способ найти проверенную кнопку RadioButton для группы? Мне кажется, что приведенный ниже код не должен быть необходим. Когда вы проверяете другой RadioButton, он знает, какой из них снять, поэтому он должен знать, который проверен. Как вытащить эту информацию, не делая много операторов if (или переключатель).

     RadioButton rb = null;

     if (m_RadioButton1.Checked == true)
     {
        rb = m_RadioButton1;
     }
     else if (m_RadioButton2.Checked == true)
     {
        rb = m_RadioButton2;
     }
     else if (m_RadioButton3.Checked == true)
     {
        rb = m_RadioButton3;
     }
112
Billy

Вы можете использовать LINQ:

var checkedButton = container.Controls.OfType<RadioButton>()
                                      .FirstOrDefault(r => r.Checked);

Обратите внимание, что для этого необходимо, чтобы все переключатели находились непосредственно в одном контейнере (например, Panel или Form), и чтобы в контейнере была только одна группа. Если это не так, вы можете сделать List<RadioButton>s в своем конструкторе для каждой группы, а затем написать list.FirstOrDefault(r => r.Checked).

205
SLaks

Вы можете связать CheckedEvents всех кнопок с одним обработчиком. Там вы можете легко получить правильный флажок.

// Wire all events into this.
private void AllCheckBoxes_CheckedChanged(Object sender, EventArgs e) {
    // Check of the raiser of the event is a checked Checkbox.
    // Of course we also need to to cast it first.
    if (((RadioButton)sender).Checked) {
        // This is the correct control.
        RadioButton rb = (RadioButton)sender;
    }
}
32
Bobby

Для тех, у кого нет LINQ:

RadioButton GetCheckedRadio(Control container)
{
    foreach (var control in container.Controls)
    {
        RadioButton radio = control as RadioButton;

        if (radio != null && radio.Checked)
        {
            return radio;
        }
    }

    return null;
}
25
João Angelo

ОП хотел получить проверенный RadioButton BY GROUP. Хотя ответ @SLaks отличный, он не отвечает на главный вопрос ОП. Чтобы улучшить ответ @SLaks, просто сделайте LINQ еще на один шаг вперед.

Вот пример из моего собственного рабочего кода. В обычном WPF мои RadioButton содержатся в сетке (называемой «myGrid») с кучей других типов элементов управления. У меня есть две разные группы RadioButton в Grid.

Чтобы получить проверенную кнопку RadioButton из определенной группы:

List<RadioButton> buttons = myGrid.Children.OfType<RadioButton>().ToList();
RadioButton rbTarget = radioButtons
      .Where(r => r.GroupName == "GroupName" && r.IsChecked)
      .Single();

Если в вашем коде нет возможности проверять кнопки RadioButton, используйте «SingleOrDefault ()». (Если я не использую кнопки с тремя состояниями, я всегда устанавливаю одну кнопку «IsChecked» в качестве выбора по умолчанию.)

10
D'Hag

Вы можете использовать событие CheckedChanged для всех ваших кнопок RadioButton. Sender будет непроверенным и проверенным RadioButtons.

5
tanascius

В дополнение к разметке CheckedChangedEvent можно было использовать свойство «Tag» элемента управления, чтобы различать переключатели ... альтернативой (код спагетти) будет свойство «TabIndex»; P

1
Binkan Salaryman

Иногда в подобных ситуациях я скучаю по своей молодости, когда Access был моим ядом выбора, и я мог дать каждой радиокнопке в группе свою собственную ценность.

Мой хак в C # заключается в использовании тега для установки значения, и когда я делаю выбор из группы, я читаю значение тега для выбранной кнопки радио. В этом примере directionGroup - это группа, в которой у меня есть четыре пять радиокнопок с «None» и «NE», «SE», «NW» и «SW» в качестве тегов на других четырех радиокнопках.

Я активно использовал кнопку, чтобы зафиксировать значение отмеченной кнопки, потому что назначение одного обработчика события для события всех кнопок CHeckCHanged вызывает срабатывание КАЖДОЙ кнопки, потому что при изменении одной из них все они изменяются. Таким образом, значение отправителя всегда является первым RadioButton в группе. Вместо этого я использую этот метод, когда мне нужно выяснить, какой из них выбран, со значениями, которые я хочу получить в свойстве Tag каждого RadioButton.

  private void ShowSelectedRadioButton()
    {
        List<RadioButton> buttons = new List<RadioButton>();
        string selectedTag = "No selection";
        foreach (Control c in directionGroup.Controls)
        {
            if (c.GetType() == typeof(RadioButton))
            {
                buttons.Add((RadioButton)c);
            }
        }
        var selectedRb = (from rb in buttons where rb.Checked == true select rb).FirstOrDefault();
        if (selectedRb!=null)
        {
             selectedTag = selectedRb.Tag.ToString();
        }

        FormattableString result = $"Selected Radio button tag ={selectedTag}";
        MessageBox.Show(result.ToString());
    }

К вашему сведению, я проверил и использовал это в своей работе.

Детеныш

1
Joseph Morgan

Вы можете использовать метод Extension для итерации коллекции RadioButton Parent.Controls. Это позволяет вам запрашивать другие RadioButton в той же области. Используя два метода расширения, вы можете с помощью первого определить, выбраны ли какие-либо радиокнопки в группе, а затем с помощью второго получить выбор. Поле RadioButton Tag может использоваться для хранения Enum для идентификации каждого RadioButton в группе:

    public static int GetRadioSelection(this RadioButton rb, int Default = -1) {
        foreach(Control c in  rb.Parent.Controls) {
            RadioButton r = c as RadioButton;
            if(r != null && r.Checked) return Int32.Parse((string)r.Tag);
        }
        return Default;
    }

    public static bool IsRadioSelected(this RadioButton rb) {
        foreach(Control c in  rb.Parent.Controls) {
            RadioButton r = c as RadioButton;
            if(r != null && r.Checked) return true;
        }
        return false;
    }

Вот типичный пример использования:

if(!MyRadioButton.IsRadioSelected()) {
   MessageBox.Show("No radio selected.");
   return;
}
int selection = MyRadioButton.GetRadioSelection;
1
James McManus

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

public static int getCheckedRadioButton(Control c)
{
    int i;
    try
    {
        Control.ControlCollection cc = c.Controls;
        for (i = 0; i < cc.Count; i++)
        {
            RadioButton rb = cc[i] as RadioButton;
            if (rb.Checked)
            {
                return i;
            }
        }
    }
    catch
    {
        i = -1;
    }
    return i;
}

Пример использования:

int index = getCheckedRadioButton(panel1);

Код не так хорошо протестирован, но кажется, что порядок индексов слева направо и сверху вниз, как при чтении текста. Если переключатель не найден, метод возвращает -1.

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

0
matsolof

если вы хотите сохранить выбор в файл или любой другой и вызвать его позже, вот что я делаю

string[] lines = new string[1];

lines[0]  = groupBoxTes.Controls.OfType<RadioButton>()
            .FirstOrDefault(r => r.Checked).Text;

File.WriteAllLines("Config.ini", lines);

затем позвоните с

string[] ini = File.ReadAllLines("Config.ini");
groupBoxTes.Controls.OfType<RadioButton>()
.FirstOrDefault(r => (r.Text == ini[0])).Checked = true;
0
ewwink

Для этой цели GroupBox имеет событие Validated, если вы используете WinForms.

private void grpBox_Validated(object sender, EventArgs e)
    {
        GroupBox g = sender as GroupBox;
        var a = from RadioButton r in g.Controls
                 where r.Checked == true select r.Name;
        strChecked = a.First();
     }
0
Bede Amarasekara

Для разработчиков, использующих VB.NET


Private Function GetCheckedRadio(container) As RadioButton
    For Each control In container.Children
        Dim radio As RadioButton = TryCast(control, RadioButton)

        If radio IsNot Nothing AndAlso radio.IsChecked Then
            Return radio
        End If
    Next

    Return Nothing
End Function
0
Nick4814