#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 после
|
likec.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 .