检查字段值是否为空。

3

我已经在这个问题上工作了一段时间,但还是错过了显而易见的。我想确保如果文本框的值留空,不会抛出错误,而是在文本框中显示一个简单的消息。然而,我所拥有的和其他几种我尝试过的类似方法都没有起作用。我无法弄清楚为什么这不起作用以及我需要做什么不同的事情。

基础知识:

这是一个简单的计算器,允许用户输入他们的腰围、颈部和身高测量值,以使用一个公式计算他们的估计体脂百分比。除非一个字段留空,否则计算是正确的。

感谢任何帮助!

我的代码:

        if (TBWaist.Text == null || TBNeck.Text == null || TBHeight.Text == null)
        {
            TBBodyFat.Text = "Value missing";
        }
        else
            if (TBWaist.Text != null & TBNeck.Text != null & TBHeight.Text != null)
            {
                double waist;
                double neck;
                double height;

                waist = Convert.ToDouble(TBWaist.Text);
                neck = Convert.ToDouble(TBNeck.Text);
                height = Convert.ToDouble(TBHeight.Text);

                TBBodyFat.Text = Convert.ToString(String.Format("{0:p2}", ((501.5 / (1.0324 - .19077 * (Math.Log10(waist - neck)) + .15456 * (Math.Log10(height))) - 450) / 100)));

错误信息

如果我把腰围文本框留空,就会收到这个错误消息。如果我留空其他任何文本框,也会收到同样的错误。

第45行输入字符串格式不正确。

waist = Convert.ToDouble(TBWaist.Text);
5个回答

5

我建议使用TryParse方法。这样,空白、空字符串或不能转换为字符串的内容都会被视为相同的情况。其次,我建议为每个文本框添加RequiredFieldValidators和/或RegularExpressionValidators,以确保用户输入一个值并且该值是数字。这样,在事件过程中进行的检查就可以作为最后一道检查,而不需要进行PostBack验证。

protected void Button1_Click(object sender, EventArgs e)
{
    //Navy Men's Body Fat Formula:  %Fat=495/(1.0324-.19077(log(abdomen-neck))+.15456(log(height)))-450 
    //string outputString = String.Format("At loop position {0}.\n", i);

    double waist;
    double neck;
    double height;

    if ( !double.TryParse( TBWaist.Text, out waist )
        || !double.TryParse( TBNeck.Text, out neck )
        || !double.TryParse( TBHeight.Text, out height ) )
    {
        ErrorMessageLabel.Text = "Please ensure that each value entered is numeric.";
        return;
    }   

    var bodyFat = (501.5 
        / (1.0324 - .19077 * (Math.Log10(waist - neck)) 
            + .15456 * (Math.Log10(height))
            ) - 450 ) / 100;

    TBBodyFat.Text = bodyFat.ToString("P2");
}

这是最全面的答案。我唯一可能建议的是在TryParse之前对Text调用Trim - Steven Sudit
2
@Steven Sudit - 在使用TryParse时不需要使用Trim。无论是"12345.6789"还是"12345.6789 "或者" 12345.6789 ",都可以被正确解析。 - Thomas

2

除了检测 null 值,您还需要检测空值。

使用 String.IsNullOrEmpty(TBWaist.Text);


1

使用RequiredFieldValidator怎么样?

或者,您可以检查该值是否为空字符串和/或null。

if (
    String.IsNullOrEmpty(TBWaist.Text) ||
    String.IsNullOrEmpty(TBNeck.Text) ||
    String.IsNullOrEmpty(TBHeight.Text)
)

0

尝试像这样进行比较

if( String.IsNullOrEmpty( TBWaist.Text ) == true )
{
     // error case
}
else
{
     // do stuff
}

1
为什么我们要将 booltrue 进行比较? - Steven Sudit
@Steven:这只是我们的编码标准,因为任何人都可以直接看到你比较的值。这并不是真正必要的。 - Viper
你可能会受到该标准的约束,但客观来看,它并不是很好,因为它是冗余和武断的。变量已经是一个布尔值了。按照这个逻辑,你应该通过无限次将比较结果与“true”进行比较来测试比较结果是否为“true”。 :-) - Steven Sudit

0
你应该使用String.IsNullOrEmpty()。你的输入字段值不是null,只是空的,因此转换失败。
protected void Button1_Click(object sender, EventArgs e)
{
    //Navy Men's Body Fat Formula:  %Fat=495/(1.0324-.19077(log(abdomen-neck))+.15456(log(height)))-450 
    //string outputString = String.Format("At loop position {0}.\n", i);


    if (String.IsNullOrEmpty(TBWaist.Text) || String.IsNullOrEmpty(TBNeck.Text) || String.IsNullOrEmpty(TBHeight.Text))
    {
        TBBodyFat.Text = "Value missing";
    }
    else
    {
        double waist;
        double neck;
        double height;

        waist = Convert.ToDouble(TBWaist.Text);
        neck = Convert.ToDouble(TBNeck.Text);
        height = Convert.ToDouble(TBHeight.Text);

        TBBodyFat.Text = Convert.ToString(String.Format("{0:p2}", ((501.5 / (1.0324 - .19077 * (Math.Log10(waist - neck)) + .15456 * (Math.Log10(height))) - 450) / 100)));
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接