1

这是我的问题。我希望能够将 10 个文本框的值加到一个双精度类型变量中。

问题是文本框值由数据库填充,并不总是填充。我希望能够对所有 10 个值求和,而无需在为空的文本框中强制默认值为零。

amount = Convert.ToDouble(amount1TextBox.Text + amount2TextBox.Text + amount3TextBox.Text + amount4TextBox.Text + amount5TextBox.Text + amount6TextBox.Text + amount7TextBox.Text + amount8TextBox.Text + amount9TextBox.Text + amount10TextBox.Text);
4

7 回答 7

5

扩展方法怎么样TextBox

namespace System
{
    public static class Extensions
    {
        public static double AsDouble(this TextBox t)
        {
            double val;
            double.TryParse(t.Text, out val);
            return val;
        }
    }
}

然后你可以像这样使用它:

var amt = amount1TextBox.AsDouble() +
    amount2TextBox.AsDouble() +
    amount3TextBox.AsDouble() +
    amount4TextBox.AsDouble() +
    amount5TextBox.AsDouble() +
    amount6TextBox.AsDouble() +
    amount7TextBox.AsDouble() +
    amount8TextBox.AsDouble() +
    amount9TextBox.AsDouble() +
    amount10TextBox.AsDouble();

这也意味着在任何其他时候您需要获取TextBoxa 的值时,double它真的很简单;在应用程序的任何形式!

于 2013-10-22T13:39:59.397 回答
4

抱歉,您需要检查每个文本框的值。将它作为一个单独的函数会更简洁一些:

public double GetValue(string text)
{
    if(string.IsNullOrEmpty(text)) 
        return 0;

    double value;

    if(double.TryParse(text, out value))
        return value;

    // not parsable
    return 0;
}

并打电话

amount = 
    GetValue(amount1TextBox.Text) + 
    GetValue(amount2TextBox.Text) + 
    GetValue(amount3TextBox.Text) + 
    GetValue(amount4TextBox.Text) + 
    GetValue(amount5TextBox.Text) +         
    GetValue(amount6TextBox.Text) + 
    GetValue(amount7TextBox.Text) + 
    GetValue(amount8TextBox.Text) + 
    GetValue(amount9TextBox.Text) + 
    GetValue(amount10TextBox.Text);
于 2013-10-22T13:39:51.053 回答
3

您不能添加字符串并期望它们以数字形式相加。您只需连接文本。

您应该使用Double.TryParse来检查字符串是否可以被解析:

double d1;
double.TryParse(amount1TextBox.Text, out d1));
double d2
double.TryParse(amount2TextBox.Text, out d2));
// and so on ...

double result = d1 + d2 + .... + d10;
于 2013-10-22T13:41:07.153 回答
2

一点LINQ:

amount = Controls.OfType<TextBox>()
                 .Where(tb => tb.Name.StartsWith("amount"))
                 .Select(tb => tb.Text)
                 .Where(s => !String.IsNullOrEmpty(s))
                 .Sum(s => Int32.Parse(s));

假设您的文本框为空或有数字。如果可以在这些文本框中输入一些文本,那么最后一行应该如下所示:

.Sum(s => { int i; return Int32.TryParse(s, out i) ? i : 0; })
于 2013-10-22T13:45:04.453 回答
2

小乐趣Linq

var total = new[]{ amount1TextBox, amount2TextBox ,amount3TextBox, ...}
            .Sum(x=> x.AsDouble());

就像新人的回答中的 AsDouble 一样。

于 2013-10-22T13:50:36.760 回答
2

你有几件事在这里发生。首先是您+在字符串上使用运算符,它将它们连接为字符串而不是将它们作为数字求和。因此,您需要先将它们转换为数字。

当然,所有这些文本框可能会有点臃肿。但听起来你有一些业务逻辑可能会使它更容易。您不需要强制文本框显示a 0,但您可以在没有有效值的情况下将它们的默认为0

您可以首先创建一个简单的扩展方法TextBox来获取它的数值,或者默认的0. 像这样的东西:

public static double GetAmount(this TextBox t)
{
    double result = 0;
    double.TryParse(t.Text, out result);
    return result;
}

对于任何给定TextBox,您现在可以通过以下方式轻松获取数值:

amount1TextBox.GetAmount();

这也意味着您可以对它们求和而不是连接它们,并且您不需要将总和转换为 a,double因为数量已经double是 s。所以你可以做这样简单的事情:

amount = amount1TextBox.GetAmount() +
         amount2TextBox.GetAmount() +
         //...
         amount10TextBox.GetAmount();
于 2013-10-22T13:41:59.353 回答
1

我知道您已经选择了适合您的答案,但是因为您要求举个例子,并且因为其他人可能想要不同的解决方案,所以我在这里放了我的路。

private  double GetSum(params TextBox[] arr)
    {
        double sum = 0;
        double temp;
        foreach (TextBox txt in arr)
        {
            double.TryParse(txt.Text,out temp);
            sum += temp;
        }
        return sum;
    }

并使用它:

double a = GetSum(new TextBox() { Text = "1" }, new TextBox() { Text = "1" }, new TextBox() { Text = "1" }, new TextBox() { Text = "a" });

就个人而言,我喜欢 linq,它非常适合数据操作,但并非每个问题都需要复杂的解决方案,我宁愿使用易于维护且易于他人理解的简单干净的解决方案。但同样只有我:)

于 2013-10-23T12:43:01.460 回答