如何迭代文本框并应用计算

时间:2015-05-05 07:16:52

标签: c# winforms

我有一个20 textboxes的应用,当database选择时,他们会从combobox获取其值。我需要进行计算(将textBoxes值相加)并在选择label选项时在textboxcombobox中显示结果。

我将texBoxes添加到array中,然后迭代它们。但是我的结果是0。

问题

enter image description here

我的代码:

private void sumTextBoxes()
    {
        TextBox[] txt;
        txt = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10 };

        int value;

        foreach (TextBox tb in txt)
        {
            if(tb !=null)
            {
                if (int.TryParse(tb.Text, out value))
                {
                    if (textBox11.Text.Length > 0)
                    {
                        textBox11.Text = (int.Parse(textBox11.Text) + value).ToString();
                    }
                    else
                        textBox11.Text = value.ToString();
                }
            }


            //label3.Text = Convert.ToString(value);

        }
        }

我哪里错了?或者更好的解决方法? PS:左边的文本框1-10,总数是11,右边的12-21总是22

5 个答案:

答案 0 :(得分:1)

总结您可以使用的所有数据 Linq

  textBox11.Text = txt
    .Where(item => item != null) // <- Actually you don't need this
    .Select(item => { // form TextBox to its integer value and parse result
      int value;
      Boolean result = int.TryParse(item.Text, out value);
      return new {
        result = result,
        value = value
      };
    })
    .Where(item => item.result) // filter out all that parsed
    .Sum(item => item.value)
    .ToString();

不要明确地将 TextBox es放入数组,但查询也是如此:

textBox11.Text = Controls // <- if the TextBoxes are on the form
  .Cast<TextBox>()
  .Where(item => item != textBox11) // <- all TextBoxes except that with a total
  .Select(item => {
...

答案 1 :(得分:1)

以下是Int32.Tryparse()文档的关键部分:

  

当此方法返回时,如果转换成功,则包含等效于s中包含的数字的32位有符号整数值;如果转换失败,则包含零。如果s参数为null或String.Empty,格式不正确,或者表示小于MinValue或大于MaxValue的数字,则转换失败。 此参数未初始化传递;结果中最初提供的任何值都将被覆盖。

这意味着您无法正常应用求和运算(返回int,添加到以前的结果,重复)。

那怎么解决呢?如果TryParse()的返回值为真,则临时变量和求和结果是一种方式:

// A mock but the idea is the same            
var tx = new[] { new TextBox { Text = "1" }, new TextBox { Text = "2" }, new TextBox { Text = "" }, new TextBox { Text = "3" } };

var sum = 0;
foreach (TextBox t in tx) {
    var temp = 0;
    if (Int32.TryParse(t.Text, out temp)) {
        sum += temp; 
    }
}

Console.WriteLine(sum);

我想你也可能想出一种LINQ-ish的方法来做到这一点,但这可能最终会让其他任何东西更加混乱。对于像这样的任务,我会坚持哪种可读性。

答案 2 :(得分:0)

据我所知 - 您正在使用字符串字段textBox11.Text来存储整数数据,并将其转换为字符串并返回整数。

如果你没有非常强有力的理由(可能没有问题范围) - 最好将所有整数值加总为整数变量,而不是字符串一。

int value;
int result = 0;

foreach (TextBox tb in txt)
{
    if(tb !=null)
    {
        if (int.TryParse(tb.Text, out value))
        {
            result += value;
        }
    }
}

label3.Text = Convert.ToString(result);

答案 3 :(得分:0)

我会使用DataGridView而不是这些文本框。看看下面的工作样本(非常简单的计算)。

    DataTable table = new DataTable();

    private void CalculatedFieldGrid_Load(object sender, EventArgs e)
    {

        table.Columns.Add("Name");
        table.Columns.Add("Count", typeof(int));

        table.Rows.Add();
        table.Rows[0][0] = "One";
        table.Rows[0][1] = 10;

        table.Rows.Add();
        table.Rows[1][0] = "Two";
        table.Rows[1][1] = 20;

        table.Rows.Add();
        table.Rows[2][0] = "Three";
        table.Rows[2][1] = 30;

        table.Rows.Add();
        table.Rows[3][0] = "Four";
        table.Rows[3][1] = 40;

        table.Rows.Add();
        table.Rows[4][0] = "Calculated Value: ";

        dataGridView1.DataSource = table;

        comboBox1.Items.Add("Add");
        comboBox1.Items.Add("Average");
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedIndex == 0)
        {
            table.Rows[4][1] = table.Compute("Sum(Count)", null);
        }
        else if (comboBox1.SelectedIndex == 1)
        {
            table.Rows[4][1] = table.Compute("Avg(Count)", null);
        }
        dataGridView1.DataSource = table;
    }

答案 4 :(得分:-1)

以下解决方案适用于双打,仅刷新和文本框一次,并将解析工作减少到最小:

private void sumTextBoxes()
{
    TextBox[] txt;
    txt = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10 };

    double sum = 0;
    double value;

    foreach (TextBox tb in txt)
    {
        if (tb !=null)
        {
            if (double.TryParse(tb.Text, out value))
            {
                sum += value;
            }
        }
    }

    textBox11.Text = sum.ToString();
}