bsb25 Ответов: 6

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


У меня есть 7 переключателей в групповом окне. У меня есть следующий код
private void initgrpBox1()
{
  groupBox1.Controls.Add(radioButton1);
  groupBox1.Controls.Add(radioButton2);
  groupBox1.Controls.Add(radioButton3);
  groupBox1.Controls.Add(radioButton4);
  groupBox1.Controls.Add(radioButton5);
  groupBox1.Controls.Add(radioButton6);
  groupBox1.Controls.Add(radioButton7);
  Controls.Add(groupBox1);
}

Я хочу установить алфавит для каждого переключателя, отмеченного в групповом поле.
Я попытался использовать оператор foreach для обхода радиокнопок в groupbox,но это не работает
//foreach(rad as RadioButton in groupBox1.controls )

Пожалуйста, дайте мне знать, как проверить, проверен ли переключатель.

6 Ответов

Рейтинг:
50

Sergey Alexandrovich Kryukov

Давайте предположим, что это так System.Windows.Forms.

Создайте некоторый тип данных, необходимый для идентификации действия, связанного с переключателем. Предположим, что это перечисление, выражающее некоторый набор опций, но это может быть что угодно:

enum RadioOption {
   None, Good, Bad, Fair, Excellent, Perfect,
}


Теперь добавьте эти данные в виде Control.Tag (который относится к этому типу System.Object:

RadioButton rb = new Radio(button);
rb.Tag = RadioOption.Good;
rb.Name = string.Format("&{0}", RadioOption.Good); 
rb.Top = //...
//...
groupBox1.Controls.Add(rb);
rb = new Radio(button);
rb.Tag = RadioOption.Perfect;
rb.Name = string.Format("&{0}", RadioOption.Perfect); 
rb.Top = //...
//...
groupBox1.Controls.Add(rb);


Теперь вам нужно извлечь эту информацию из выбранного переключателя:

static RadioOption GetOption(RadioButton radio) {
    return (RadioOption)radio.Tag;
}


Вы должны убедиться, что описанный выше метод вызывается только для переключателей "помеченных" с помощью метода, показанного выше. Вы можете поместить любую другую информацию в тег. Определите тип, который вам нужен, в зависимости от того, как вы хотите его использовать.

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

rb.CheckedChanged += (sender, eventArgs) => {
   RadioButton aButton = (RadioButton)sender;
   RadioOption option = GetOption(sender as RadioButton);
   DoSomethingWhenCheckedChanged(aButton.Cheched, option);
}; //rb.CheckedChanged


—СА


Olivier Levrey

Идеальный ответ с хорошими советами. Мой 5. (только что исправлена кодовая метка).

Sergey Alexandrovich Kryukov

Спасибо, Оливье.
--СА

johannesnestler

очень хорошие советы - ваши решения всегда показывают ваш практический опыт.

Sergey Alexandrovich Kryukov

Спасибо. Ну... иногда так и бывает.
--СА

Рейтинг:
38

#realJSOP

Просто обработайте событие Clicked для всех переключателей в группе в одном обработчике событий и сохраните переключатель clicked как отдельный var, что-то вроде этого:

public partial class MyForm
{
    RadioButton m_radiogroup1Checked = null;

    private void initgrpBox1()
    {
        AddRadioToGroupBox(groupBox1, radioButton1);
        AddRadioToGroupBox(groupBox1, radioButton2);
        AddRadioToGroupBox(groupBox1, radioButton3);
        AddRadioToGroupBox(groupBox1, radioButton4);
        AddRadioToGroupBox(groupBox1, radioButton5);
        AddRadioToGroupBox(groupBox1, radioButton6);
        AddRadioToGroupBox(groupBox1, radioButton7);
        Controls.Add(groupBox1);
    }

    private void AddRadioToGroupBox(GroupBox groupBox, RadioButton radioButton)
    {
        groupBox.Controls.Add(radioButton);
        radioButton.Clicked += new EventHandler(radioGroup1Checked);
    }

    private void radioGroup1_Clicked(object sender, e EventArgs)
    {
        m_radiogroup1Checked = sender as RadioButton;
    }
}


Таким образом, существует не так много дополнительной записи кода (как показано в других решениях). Просто дайте форме сделать свое дело, и в любое время, когда вы захотите, вы можете проверить значение m_radiogroup1Checked чтобы посмотреть, какая кнопка была проверена.

Легкий персик, выжатый лимон...

Вы также можете создать RadioGroup класс, который занимался всем этим для тебя...


johannesnestler

да, хороший подход для операции!

Рейтинг:
28

Michel [mjbohn]

Вы можете попробовать это

foreach (RadioButton rb in groupBox1.Controls)
           {
               MessageBox.Show(rb.Name);
           }


Но это сломалось бы, если бы были более жесткие средства управления, чем RadioButton В вашем GroupBox

Так что тебе лучше воспользоваться этим:

foreach (Control c in groupBox1.Controls)
            {
                if (c.GetType() == typeof(RadioButton))
                {
                    RadioButton rb = c as RadioButton;
                    if (rb.Checked)
                    {
                        MessageBox.Show(rb.Name); 
                    }
                }
            }
            }


dadrock52

(Год)
отлично
-------
Я надеюсь стать мусульманином
поклоняться только одному Богу Аллаху

Рейтинг:
2

johannesnestler

Я просто хочу указать на альтернативу. Может быть, это не самое лучшее решение для вас, но кто знает?
Другие показали, что цикл над элементами управления GroupBox нуждается в некоторой проверке на правильный тип и, возможно, также для интересующих вас радиокнопок. Мое решение только добавляет выделенный массив для хранения ссылок на радиокнопки - легко перебирать их. В качестве опции я показываю, как получить проверенный RadioButton с Linq.

using System;
using System.Linq;
using System.Windows.Forms;

namespace AreYouChecked
{
    static class Program
    {
        static void Main()
        {
            const int iNR_RADIO_BUTTONS = 7;
            // Create a Form
            Form form = new Form();
            // ... and a GroupBox
            GroupBox groupbox = new GroupBox();
            groupbox.Dock = DockStyle.Fill;
            // Store the RadioButtons in an dedicated array
            RadioButton[] aRadioButtons = new RadioButton[iNR_RADIO_BUTTONS];
            // ... and add them to the GroupBox
            for (int i = aRadioButtons.Length - 1; i >= 0; i--)
            {
                aRadioButtons[i] = new RadioButton();
                aRadioButtons[i].Dock = DockStyle.Top;
                aRadioButtons[i].Text = "Option" + i;
                groupbox.Controls.Add(aRadioButtons[i]);
            }
            // Create a Button for testing
            Button buttonAsk = new Button();
            buttonAsk.Dock = DockStyle.Bottom;
            buttonAsk.Text = "Which RadioButton checked?";
            buttonAsk.Click += delegate(object sender, EventArgs e)
            {
                // Find out which RadioButton is checked:
                // 
                // Option1: loop over the dedicated array
                RadioButton rbIamChecked = null;
                foreach (RadioButton rb in aRadioButtons)
                {
                    if (rb.Checked)
                    {
                        rbIamChecked = rb;
                        break; // don't forget to break here, only one RadioButton should be checked!
                    }
                }
                // Option2: use Linq
                //try
                //{
                //    rbIamChecked = aRadioButtons.Single(r => r.Checked);
                //}
                //catch (InvalidOperationException ex)
                //{
                //    // none/multiple checked 
                //}
                //
                // Do something 
                MessageBox.Show(rbIamChecked != null ? rbIamChecked.Text : "None");
            };

            // Add Controls to the Form
            form.Controls.Add(groupbox);
            form.Controls.Add(buttonAsk);
            // ... and Show it;
            Application.Run(form);
        }
    }
}


Рейтинг:
1

Abhinav S

Добавить новое событие изменения для каждого из этих кнопок.

Например, для
задав ему значение radiobutton1.CheckedChanged +=новый EventHandler(radiobutton1_CheckedChanged);

Затем вы должны иметь возможность отслеживать событие checkchanged.


Sergey Alexandrovich Kryukov

Абхинав, проблема в том, что вы не ответили на вопрос "Как узнать, какой именно?". Об этом событии никто не спрашивал.
Однако я поставил более полный ответ, Пожалуйста, смотрите.

Рейтинг:
0

Member 14620154

var buttonsChecked = groupBox1.Controls.OfType<RadioButton>()
               .FirstOrDefault(a => a.Checked);