Проверка нескольких текстовых полей, если они пустые или пустые - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть форма, где у меня много текстовых полей, и все они должны быть заполнены. В C # как на самом деле, если проверить, есть ли группа полей, имеющих ноль или пробел?

Я знаком с string.isNullOrWhiteSpace(string here), но я не хочу делать несколько выражений, если это приведет к неправильному коду.

Я пытаюсь избежать чего-то подобного

if(string.isNullOrWhiteSpace(string here)
   || string.isNullOrWhiteSpace(string here)
   || string.isNullOrWhiteSpace(string here))
{
   // do something
}

Есть ли исправления для этого типа плохого кода?

Ответы [ 3 ]

3 голосов
/ 26 февраля 2012

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

var emptyTextboxes = from tb in this.Controls.OfType<TextBox>()
                     where string.IsNullOrEmpty(tb.Text)
                     select tb;

if (emptyTextboxes.Any())
{
    // one or more textboxes are empty
}

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

bool isIncomplete = this.Controls.OfType<TextBox>().Any(tb => string.IsNullOrEmpty(tb.Text));
if (isIncomplete)
{
    // do your work
}

Для этого кода вы должны работать как минимум с Visual Studio 2008 / C # 3 /.NET 3.5.В вашем проекте должна быть ссылка на System.Core.dll (по умолчанию она должна быть), а в файле класса вам нужна директива using System.Linq;.


На основании ваших комментариев рассмотрим другой методесли у вас возникли проблемы с пониманием или работой с версией linq.Конечно, вы можете сделать это в явном цикле (в конечном счете, код Linq также будет циклом).Рассмотрим

bool isIncomplete = false; 
foreach (Control control in this.Controls)
{
     if (control is TextBox)
     {
          TextBox tb = control as TextBox;
          if (string.IsNullOrEmpty(tb.Text))
          {
               isIncomplete = true;
               break;
          }
     }
}

if (isIncomplete)
{

}

Наконец, этот код написан так, как будто все текстовые поля находятся в одном контейнере.Этот контейнер может быть формой, панелью и т. Д. Вам нужно будет указать на соответствующий контейнер (например, вместо this (форма) это может быть this.SomePanel).Если вы работаете с элементами управления, которые находятся в нескольких и, возможно, вложенных контейнерах, вам потребуется проделать дополнительную работу, чтобы найти их программно (рекурсивный поиск, явное объединение и т. Д.), Или вы можете просто предварительно загрузить ссылки в массив или другую коллекцию.Например,

var textboxes = new [] { textbox1, textbox2, textbox3, /* etc */ };
// write query against textboxes instead of this.Controls

Вы сказали, что у вас есть несколько элементов управления GroupBox.Если каждый GroupBox загружен в форму и не вложен в другой элемент управления, это может помочь вам начать работу.

var emptyTextboxes = from groupBox in this.Controls.OfType<GroupBox>()
                     from tb in groupBox.Controls.OfType<TextBox>()
                     where string.IsNullOrEmpty(tb.Text)
                     select tb;
1 голос
/ 26 февраля 2012

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

var incompleteTextBoxes = this.Controls.OfType<TextBox>()
                              .Where(tb => string.IsNullOrWhiteSpace(tb.Text));

foreach (var textBox in inCompleteTextBoxes)
{
    // give user feedback about which text boxes they have yet to fill out
}
0 голосов
/ 26 февраля 2012

Еще одно решение.Это будет рекурсивно перемещаться по всему дереву управления и проверять наличие пустого или пустого текста во всех текстовых полях.предостережение - если у вас есть какие-то необычные элементы управления, не наследующие стандартное текстовое поле Winforms - проверка не будет выполнена

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