C# 如何添加多个文本框数字,并将总和存储为double-in变量

C# 如何添加多个文本框数字,并将总和存储为double-in变量,c#,winforms,textbox,C#,Winforms,Textbox,这是我的问题。我希望能够将10个文本框的值相加成一个双类型变量 问题是文本框值由数据库填充,并且不总是填充。我希望能够对所有10的值求和,而不必强制文本框中为空的默认值为零 amount = Convert.ToDouble(amount1TextBox.Text + amount2TextBox.Text + amount3TextBox.Text + amount4TextBox.Text + amount5TextBox.Text + amount6TextBox.Text + amoun

这是我的问题。我希望能够将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);

很抱歉,您需要检查每个文本框的值。将其作为一个单独的功能会更干净一些:

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);

很抱歉,您需要检查每个文本框的值。将其作为一个单独的功能会更干净一些:

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);

文本框的扩展方法如何:

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();
public static double GetAmount(this TextBox t)
{
    double result = 0;
    double.TryParse(t.Text, out result);
    return result;
}

这也意味着,在任何其他时间,您需要将
TextBox
的值作为
double
直接获取;申请表中的任何表格

对于
文本框的扩展方法如何

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();
public static double GetAmount(this TextBox t)
{
    double result = 0;
    double.TryParse(t.Text, out result);
    return result;
}

这也意味着,在任何其他时间,您需要将
TextBox
的值作为
double
直接获取;申请表中的任何表格

不能添加字符串并期望它们以数字求和。您将仅连接文本

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

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

double result = d1 + d2 + .... + d10;

不能添加字符串并期望它们以数字求和。您将仅连接文本

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

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

double result = d1 + d2 + .... + d10;

你有两件事要做。首先是对字符串使用
+
运算符,它将它们作为字符串连接起来,而不是作为数字求和。所以你需要先把它们转换成数字

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

您可以首先为
TextBox
创建一个简单的扩展方法,以获取其数值,或者默认值
0
。大概是这样的:

var amt = amount1TextBox.AsDouble() +
    amount2TextBox.AsDouble() +
    amount3TextBox.AsDouble() +
    amount4TextBox.AsDouble() +
    amount5TextBox.AsDouble() +
    amount6TextBox.AsDouble() +
    amount7TextBox.AsDouble() +
    amount8TextBox.AsDouble() +
    amount9TextBox.AsDouble() +
    amount10TextBox.AsDouble();
public static double GetAmount(this TextBox t)
{
    double result = 0;
    double.TryParse(t.Text, out result);
    return result;
}
对于任何给定的
文本框
,您现在可以通过以下方式轻松获取数值:

amount1TextBox.GetAmount();
这也意味着您可以对它们求和,而不是将它们串联起来,并且不需要将总和转换为
double
,因为金额已经是
double
s。所以你可以做一些简单的事情如下:

amount = amount1TextBox.GetAmount() +
         amount2TextBox.GetAmount() +
         //...
         amount10TextBox.GetAmount();

你有两件事要做。首先是对字符串使用
+
运算符,它将它们作为字符串连接起来,而不是作为数字求和。所以你需要先把它们转换成数字

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

您可以首先为
TextBox
创建一个简单的扩展方法,以获取其数值,或者默认值
0
。大概是这样的:

var amt = amount1TextBox.AsDouble() +
    amount2TextBox.AsDouble() +
    amount3TextBox.AsDouble() +
    amount4TextBox.AsDouble() +
    amount5TextBox.AsDouble() +
    amount6TextBox.AsDouble() +
    amount7TextBox.AsDouble() +
    amount8TextBox.AsDouble() +
    amount9TextBox.AsDouble() +
    amount10TextBox.AsDouble();
public static double GetAmount(this TextBox t)
{
    double result = 0;
    double.TryParse(t.Text, out result);
    return result;
}
对于任何给定的
文本框
,您现在可以通过以下方式轻松获取数值:

amount1TextBox.GetAmount();
这也意味着您可以对它们求和,而不是将它们串联起来,并且不需要将总和转换为
double
,因为金额已经是
double
s。所以你可以做一些简单的事情如下:

amount = amount1TextBox.GetAmount() +
         amount2TextBox.GetAmount() +
         //...
         amount10TextBox.GetAmount();
一点灵气:

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

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

使用
Linq的乐趣不多

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

哪里是双重来源。

Linq的小乐趣

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

我知道你已经选择了一个适合你的答案,但因为你要求举个例子,而且其他人可能需要不同的解决方案,所以我在这里用我的方式

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它非常适合数据处理,但不是所有问题, 需要一个复杂的解决方案,我宁愿选择一个简单的、干净的、易于维护且易于他人理解的解决方案。
我知道你已经选择了一个适合你的答案,但因为你要求举个例子,而且因为其他人可能需要不同的解决方案,我会在这里说明

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它非常适合数据处理,但不是所有问题, 需要一个复杂的解决方案,我宁愿选择一个简单的、干净的、易于维护且易于他人理解的解决方案。
但是,这只是我:)

强制默认值为零有什么问题?你不会得到同样的结果吗?“不强制文本框中为空的默认值为零。”嗯?因为我正在将值保存到另一个数据库中,这会使程序认为值零实际上是一个需要保存的值。这是一个数据库规范化项目。@TimSchmelter,如果有空值,程序将抛出一个错误。如果我在textboxs中添加了一个默认值零,并且该值为null,则不会抛出错误。这种解决方案对我不起作用强制默认值为零有什么问题?你不会得到同样的结果吗?“不强制文本框中为空的默认值为零。”嗯?因为我正在将值保存到另一个数据库中,这会使程序认为值零实际上是一个需要保存的值。这是一个数据库规范化项目。@TimSchmelter,如果有空值,程序将抛出一个错误。如果我在textboxs中添加了一个默认值零,并且该值为null,则不会抛出错误。这个解决方案对我不起作用,我想你不需要
Convert.ToDouble
call:)我想你不需要
Convert.ToDouble