在Windows窗体应用程序中动态生成控件的计算

时间:2014-02-17 07:02:31

标签: c# .net winforms linq

我正在制作一个程序来学习如何在Button_Click事件的循环内动态生成控件,现在我正在尝试计算两个字段的乘法及其在第三个TextBox中的输出

代码:

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{


    unit.Location = new System.Drawing.Point(unitstartposition, unitstartpositionV);
    unit.Size = new System.Drawing.Size(100, 30);
    unit.Text = "";
    unit.Name = "unit" + i.ToString();

    rate.Location = new System.Drawing.Point(ratestartposition, ratestartpositionV);
    unit.Size = new System.Drawing.Size(100, 30);
    rate.Text = "";
    rate.Name = "rate" + i.ToString();

    amt.Location = new System.Drawing.Point(amtstartposition, amtstartpositionV);
    amt.Size = new System.Drawing.Size(100, 30);
    amt.Text = "";
    amt.Name = "amt" + i.ToString();

    panel1.Controls.Add(unit);
    panel1.Controls.Add(rate);
    panel1.Controls.Add(amt);


    unitstartpositionV += 30;
    ratestartpositionV += 30;
    amtstartpositionV += 30;

    unit = new TextBox();
    rate = new TextBox();
    amt = new TextBox();


}

现在我想像

一样计算它
amt0.Text = (ConvertToInt32(unit0.Text) * ConvertToInt32(rate0.Text)).ToString();
amt1.Text = (ConvertToInt32(unit1.Text) * ConvertToInt32(rate1.Text)).ToString();

等等

最后我想总结所有的amt(i)。请帮助实现这一目标。

1 个答案:

答案 0 :(得分:0)

从'unitstartpositionV + = 30;'行开始以后,这就是我想出来解决这个问题的方法:

            unitstartpositionV += 30;
            ratestartpositionV += 30;
            amtstartpositionV += 30;

            unit = new TextBox();
            rate = new TextBox();
            amt = new TextBox();
            unit.Tag = rate;
            rate.Tag = amt;
            amt.Tag = unit;


            rate.TextChanged += rate_TextChanged;
            unit.TextChanged += unit_TextChanged;
        }
    }

    private void rate_TextChanged(object sender, EventArgs e)
    {

        var rate = sender as TextBox;
        var amt = rate.Tag as TextBox;
        var unit = amt.Tag as TextBox;
        Calc(rate.Text, unit.Text, amt);
    }

    private void unit_TextChanged(object sender, EventArgs e)
    {
        var unit = sender as TextBox;
        var rate = unit.Tag as TextBox;
        var amt = rate.Tag as TextBox;
        Calc(rate.Text, unit.Text, amt);
    }

    private void Calc(string rate, string unit, TextBox amt)
    {
        int rateInt;

        if (!int.TryParse(rate, out rateInt)) return;

        int unitInt;
        if (!int.TryParse(unit, out unitInt)) return;

        amt.Text = (rateInt * unitInt).ToString();
    }

(它不包括所有的总和)

我已经以一种不同寻常的方式解决了这个问题,以适应你所展示的风格。但实际上你应该使用数组,列表或某种“集合”来保存你的控件。从回顾你的其他答案,我不认为你已经了解IEnumerable。这就是你所缺少的概念,它会使这种活动变得更加简单(特别是'总和'要求)。