2013-09-24 4 views
3

у меня есть, если заявление, чтобы запустить некоторый код, когда все текстовые поля на форме будут завершены,Уменьшение состояния внутри если заявление

так, как я проверить для всех текстовых полей, чтобы не быть пустым в данный момент находится ниже

if (txtUserId.Text != "" 
        && txtFirstName.Text != "" 
        && txtLastName.Text != "" 
        && txtCity.Text != "" 
        && txtSTate.Text != "" 
        && txtCountry.Text != "") 
       { 
        // Some code 
       } 

Есть ли лучший способ написать это?

+0

что вы используете? WPF или формы? – Naren

+0

'string.IsNullOrEmpty'. – Arran

+0

Определите «лучше». Является ли код понятным и выполняет ли он свою работу прямо сейчас? Я бы сказал, что ответ на оба из них «да», и что вам не нужно ничего менять об этом. (Если вы не планируете резко увеличивать количество полей.) – Omaha

ответ

10

Аннотация проверка вне в функции:

bool IsFilled(TextBox tb) { return tb.Text != ""; } 

Затем вы можете использовать старый, упрощенный код, или этот трюк:

var textBoxes = new [] { txtUserId, txtFirstName, ... }; 
if (textBoxes.All(tb => IsFilled(tb)) { ... } 

Это, вероятно, более масштабируемым более text- коробки, которые вы получаете.

Вы также можете написать textBoxes.All(IsFilled), который работает из-за преобразования группы методов в делегат. Это немного более совершенный, и короче. Тем не менее, я считаю, что преобразование группы методов сложно понять и ввести в заблуждение. Другие люди могут спросить вас: «Что это делает?» и это указывает на запах кода. Я это не рекомендую.

+0

Хорошо, я также избавился от двойного отрицания. В любом случае, это не понравилось. Является сомнительным, является ли IsFilled даже необходимым здесь, но я подумал, что, возможно, проверка станет более сложной в будущем (тест для белого пространства, ...). Мы не хотели бы дублировать все это. – usr

+0

Теперь вы можете уменьшить 'textBoxes.All (tb => IsFilled (tb))' to 'textBoxes.All (IsFilled)'. – Henrik

+0

Я намеренно не сделал этого, потому что я считаю, что метод группового преобразования трудно понять и ввести в заблуждение. Думаю, это моя личная черта. – usr

3
TextBox[] boxes = new[] { txtUserId, txtFirstName, txtLastName, txtCity, txtSTate, txtCountry }; 

if (boxes.All(x => x.Text != "")) 
{ 
    // Some code 
} 
0

Вы можете перекрёсток TextBox es в свою форму.

private bool AreThereAnyEmptyTextBoxes() 
{ 
    foreach (var item in this.Controls) 
    { 
     if (item is TextBox) 
     { 
      var textBox = (TextBox)item; 
      if (textBox.Text == string.Empty) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 
0

Предполагая, что вы используете элементы управления Windows Forms, вы можете написать следующее:

public bool AllTextEntered(params Control[] controls) 
{ 
    return controls.All(control => (control != null) && (control.Text != "")); 
} 

Что вы можете назвать так:

if (AllTextEntered(txtUserId, txtFirstName, txtLastName, txtCity, txtSTate, txtCountry)) 
{ 
    // ... 
} 

Использование params имеет преимущество, что позволяет вы должны передать столько элементов управления, сколько хотите, без необходимости вручную писать код, чтобы поместить их все в массив, который вы переходите на AllTextEntered().

Также обратите внимание, что тест (control != null), вероятно, не нужен.

0

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

Например:

у вас есть модель UserDetail, как показано ниже

public class UserDetail{ 

    public string FirstName {get;set;} 

    public string LastName {get;set;} 

    public string Country {get;set;} 
} 

Тогда давайте предположим, у вас есть объект userDetail и вы хотели бы, чтобы проверить, чтобы убедиться, что ни один из свойств в объекте UserDetail является null или empty, используя LINQ.

return userDetail.GetType().GetProperties() 
    .Where(pi => pi.GetValue(userDetail) is string) 
    .Select(pi => (string) pi.GetValue(userDetail)) 
    .All(value => !String.IsNullOrEmpty(value)); 

Этот метод вернет true, если ни одно из свойств строки объекта userDetail не имеет значения null или пусто. Если все свойства содержат что-то, то это выводит true.

логика была бы:

public bool AllUserDetailsContainSomething(UserDetail userDetail){ 

return userDetail.GetType().GetProperties() 
     .Where(pi => pi.GetValue(userDetail) is string) 
     .Select(pi => (string) pi.GetValue(userDetail)) 
     .All(value => !String.IsNullOrEmpty(value)); 

} 

Тогда вы можете вызвать этот метод

if(AllUserDetailsContainSomething(userDetail)){ 
//do something 
} 
Смежные вопросы