3

当表单上的所有文本框都完成时,我有一个 if 语句来运行一些代码,

我目前检查所有文本框不为空的方式如下

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

有没有更好的方法来写这个?

4

5 回答 5

10

将 check out 抽象为一个函数:

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

然后你可以使用旧的、简化的代码,或者这个技巧:

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

您获得的文本框越多,这可能更具可扩展性。

您还可以编写textBoxes.All(IsFilled)由于方法组转换为委托而起作用的方法。这稍微更高性能,更短。不过,我发现方法组转换难以理解和误导。其他人可能会问你“那有什么作用?” 这表明代码有异味。我不推荐它。

于 2013-09-24T11:24:16.167 回答
3
TextBox[] boxes = new[] { txtUserId, txtFirstName, txtLastName, txtCity, txtSTate, txtCountry };

if (boxes.All(x => x.Text != ""))
{
    // Some code
}
于 2013-09-24T11:24:34.283 回答
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;
}
于 2013-09-24T11:29:11.053 回答
0

假设您使用的是 Windows 窗体控件,您可以这样写:

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

然后你可以这样调用:

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

Usingparams的优点是允许您传递任意数量的控件,而无需手动编写代码将它们全部放入您传递给的数组中AllTextEntered()

另请注意,(control != null)测试可能并不是真正需要的。

于 2013-09-24T11:43:48.897 回答
0

在这些情况下,您也可以使用反射。当我通过多个字段的用户详细信息过滤结果时,我遇到了类似的问题。如果用户没有在搜索框中键入任何内容,则查询将返回数据库中的所有结果,这不是预期的结果。我问了这个问题,并第一次遇到了反思。

例如:

你有一个 UserDetail 模型如下

public class UserDetail{

  public string FirstName {get;set;}

  public string LastName {get;set;}

  public string Country {get;set;}
}

然后假设您有 userDetail 对象,并且您希望使用 LINQ 检查以确保 UserDetail 对象中的所有属性都不为 null 或为空。

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

如果 userDetail 对象字符串属性都不是 null 或空,则此方法将返回 true。如果所有属性都包含某些内容,则输出 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
}
于 2016-10-15T21:21:44.377 回答