переберите динамическую форму и панель и проверьте, переключаются ли переключатели - PullRequest
1 голос
/ 22 марта 2012

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

    void nextButton_Click(object sender, EventArgs e)
    {
        foreach (Control c in _form.Controls)
        {
            if (c is RadioButton)
            {
                RadioButton radio = c as RadioButton;

                if (radio is RadioButton)
                {
                    if (radio.Checked == true)
                    {
                        //code continue to next 
                    }
                    else
                    {
                        MessageBox.Show("You must select at least one.");
                    }
                }

            }
        } 
    }

С уважением Geo

Ответы [ 3 ]

1 голос
/ 22 марта 2012

Вы можете использовать Linq для упрощения

bool checked = _form.Controls.OfType<RadioButton>().Any(rb => rb.Checked);

- EDIT -

Я обновил ответ для рекурсивного поиска по всем элементам управления.

bool IsChecked(Control parent)
{
    if (parent.Controls.OfType<RadioButton>().Any(rb => rb.Checked)) return true;

    foreach (Control c in parent.Controls)
        if (IsChecked(c)) return true;

    return false;
}

bool checked = IsChecked(_form);
0 голосов
/ 22 марта 2012

Возможно, ваша радио-кнопка лежит внутри панели. И, следовательно, переключатель находится в списке элементов управления панели, а не в форме. Попробуйте вместо этого:

    private static void CheckRadioButton(Control control)
    {
        foreach (Control c in control.Controls)
        {
            if (c is RadioButton)
            {
                if (((RadioButton)c).Checked == true)
                {
                    //code continue to next 
                }
                else
                {
                    MessageBox.Show("You must select at least one.");
                    return; //should be
                }
            }
            else if (c.Controls.Count > 0)
                CheckRadioButton(c);
        }
    }

Теперь вызовите этот метод, передав form в качестве аргумента. Как это или так:

void nextButton_Click(object sender, EventArgs e)
{
    CheckRadioButton(this); //or whichever form it is..
}

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

0 голосов
/ 22 марта 2012

Если проверено одно из радио, вы должны выйти из цикла, поэтому добавьте условие выхода, если оно найдено.

 if (radio.Checked == true)
 {
      return;
 }
 else
 {
      MessageBox.Show("You must select at least one.");
 }

Для поиска вложенных элементов управления вы должны использовать:

 _form.Controls.Find()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...