Проверка всех элементов управления вместе в цикле

#c# #.net #winforms #validation #loops

#c# #.net #winforms #проверка #циклы

Вопрос:

Я использую следующий метод для проверки пользовательских вводов в TextBoxes и ComboBoxes в каждой GroupBox из Winform.

 private bool ValidateControlsIn(GroupBox gb)
{
    foreach (Control c in gb.Controls.Cast<Control>().OrderBy(c => c.TabIndex))
    {
        if (c is TextBox || c is ComboBox)
        {
            if (string.IsNullOrWhiteSpace(c.Text))
            {
                MessageBox.Show(string.Format("Empty field {0 }", c.Name.Substring(3)));
                c.Focus();
                return false;
            }
        }
    }
    return true;
}
  

Помимо ComboBoxes and TextBoxes , у меня есть RadioButtons и 1CheckBoxes1 , которые также должны быть проверены.

Поэтому я пытался также учитывать их при проверке, но безуспешно.

Можно ли было бы проверить RadioButtons и Checkboxes тоже в этом же методе / цикле?

Комментарии:

1. Вы могли бы добавить else if под проверкой текстовых полей, а затем проверить их.

2. Что вы пробовали? Почему это не удалось?

3. @ Matthijs, но проблема в том, какое свойство проверять на пустоту? c.value / c.Checked / ??

4. @DonBoitnott, я попытался включить новые условия в первый блок If после | like c.value==false и т. Д. И иметь Else If часть и т.д. и т.п.

5. @Chathuranga: Смотрите мой ответ 🙂

Ответ №1:

Проверка может выполняться несколькими различными способами. Прежде чем вы возьмете на себя обязательство написать свой собственный метод проверки, рассмотрите возможность использования элемента управления.Проверка / Контроль.Проверенные обработчики событий и метод Form.ValidateChildren . Эти положения отнимают много времени у вашей работы и добавляют аргументы события отмены, чтобы остановить процесс «оставить / потерять фокус».

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

 foreach (Control c in gb.Controls.Cast<Control>().OrderBy(c => c.TabIndex))
        {
            if (c is TextBox || c is ComboBox)
            {
                if (string.IsNullOrWhiteSpace(c.Text))
                {
                    MessageBox.Show(string.Format("Empty field {0 }", c.Name.Substring(3)));
                    c.Focus();
                    return false;
                }
            }
            else if (c is RadioButton)
            {
                //handle me
                return false;
            }
            else if (c is CheckBox)
            {
                //handle me
                return false;
            }
        }
        return true;
  

Используя доступные условия проверки / проверки, вы можете добавить пользовательский обработчик для каждого типа элемента управления или для каждого отдельного элемента управления. Это позволяет вам уменьшить размер определений методов и сделать их более модульными. Возьмем следующий пример.

 private void button1_Click(object sender, EventArgs e)
    {
        // fires validating events for all controls that are selectable.
        // other constraints are available.
        this.ValidateChildren(ValidationConstraints.Selectable);
    }


    /// <summary>
    /// Handles the validating for a single control or multiple controls.
    /// Depends on the registration.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="CancelEventArgs"/> instance containing the event data.</param>
    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
        bool condition = true;
        if (!condition)
        {
            // remaining validation and leave stack will not be performed.
            e.Cancel = true;
        }
    }

    /// <summary>
    /// Handles post validation for a single control or multiple controls.
    /// Depends on the registration.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
    private void textBox1_Validated(object sender, EventArgs e)
    {
        // handle after validation logic here.
        // spray happy faces all over the world.
    }
  

Я надеюсь, что это даст вам достойный ответ на ваш вопрос и альтернативу, которая может выглядеть и действовать немного чище.

Ответ №2:

Используйте else, если для проверки других:

 if (c is TextBox || c is ComboBox)
{
      if (string.IsNullOrWhiteSpace(c.Text))
      {
            MessageBox.Show(string.Format("Empty field {0 }", c.Name.Substring(3)));
            c.Focus();
            return false;
      }
}
else if(c is RadioButton)
{
      // Logic
}
else if(c is CheckBox)
{
      // Logic
}
  

Если вы хотите на самом деле настроить на них таргетинг, приведите их к их типам:

 RadioButton rdb = c as RadioButton;
CheckBox cb = c as CheckBox;
  

Пример:

 else if(c is RadioButton)
{
     RadioButton rd = c as RadioButton;
     if(rd != null)
     {
           if(!rd.Checked)
                // Do something
     }
}
  

Оглядываясь назад, вы могли бы фактически преобразовать C в RadioButton, поскольку вы уже проверили, является ли он одним: RadioButton rd = (RadioButton)c и затем пропустите rd != null

Комментарии:

1. Проблема не RadioButtons / CheckBoxes в том, что должно быть в форме checked . Например: если у нас есть два radioButtons вызова Male и Female , только один из них должен быть проверен? Как решить эту проблему?

2. Поместите их внутрь GroupBox элемента управления. Или используйте CheckedChangedevent , если значение a.Checked равно true, установите значение b.Checked равным false .