代码改进 - 命名文本框,从numericupdown&按钮单击

时间:2013-08-04 21:22:39

标签: c# .net

我在使用numericUpDown添加控件时遇到问题(例如,如果numericUpDown值等于3,则用户收回3个文本框)。

感谢stackoverflow用户,我改进了我的代码。

在改进之前它看起来像这样:

private void button1_Click(object sender, EventArgs e)

{

if (numericUpDown1.Value == 1)
{
    txtbx1.AutoSize = true;
    Controls.Add(txtbx1);
    txtbx1.Location = new Point(70, 100);
}
else if (numericUpDown1.Value == 2)
{
    txtbx1.AutoSize = true;
    Controls.Add(txtbx1);
    txtbx1.Location = new Point(70, 100);

    txtbx2.AutoSize = true;
    Controls.Add(txtbx2);
    txtbx2.Location = new Point(70, 130);
}
else if (numericUpDown1.Value == 3)
{
    txtbx1.AutoSize = true;
    Controls.Add(txtbx1);
    txtbx1.Location = new Point(70, 100);

    txtbx2.AutoSize = true;
    Controls.Add(txtbx2);
    txtbx2.Location = new Point(70, 130);

    txtx3.AutoSize = true;
    Controls.Add(txtbx3);
    txtbx3.Location = new Point(70, 160);
}

}

改善后:

private void button1_Click(object sender, EventArgs e)

{

int y = 100;
int x = 70;
for (int i = 0; i < numericUpDown1.Value; i++)
{
    var txtbx = new TextBox();
    txtbx.AutoSize = true;
    Controls.Add(txtbx);
    txtbx.Location = new Point(x, y);

    // Increase the y-position for next textbox.
    y += 30;
}

}

现在问题是我不知道如何为genarated文本框分配名称。 (在改进之前我可以命名它们--txtbx1,txtbx2,txtbx3 ......)

要改进的代码:

private void button3_Click(object sender, EventArgs e)
{

    try
    {
        double a, b, c, sum;

        a = double.Parse(txtbx1.Text);
        b = double.Parse(txtbx2.Text);
        c = double.Parse(txtbx3.Text);

        sum = a + b + c;
        label1.Text = sum.ToString();



    }

    catch (Exception ex)
        {
            MessageBox.Show("error");
        }

请注意我是初学者,通过观看youtube教程来学习c#;)我确实意识到我的问题可能很愚蠢,但我自己无法处理这个问题。

提前感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:0)

如果您之后需要访问它们,您有一些选择。 我猜你的目标是将label1的文本设置为指定文本框中包含的值的总和

ValueChanged的{​​{1}}事件中,检查 delta ,然后向NumericUpDown添加或删除所需数量的TextBoxesForm。要获取 delta ,您需要存储Controls的先前值,然后从当前值中减去它。 (如果是5,现在是4,4-5 = -1。文本框已被删除。)

NumericUpDown

但是,如果您的最大数量为3,则可以采用略有不同的方法。我的解决方案适用于 n-textboxes

最后,要从代码中获取 private int _oldNUDvalue = 0; //or assign it to the default value private void numericUpDown1_ValueChanged(object sender, EventArgs e) { int delta = (int)numericUpDown1.Value - _oldNUDvalue; if (delta < 0) { for (int i = -delta; i > 0; i--) { var tbox = Controls.Find("ntextBox" + (_oldNUDvalue - i), false)[0]; Controls.Remove(tbox); } } else if (delta > 0) { for (int i = _oldNUDvalue; i < _oldNUDvalue + delta; i++) { var tbox = new TextBox(); tbox.Location = new Point(15, 55 + (30 * i)); tbox.Name = "ntextBox" + i; Controls.Add(tbox); } } _oldNUDvalue = (int)numericUpDown1.Value; } es'值,您有三种方法:

  

遍历Form的控件,检查TextBoxes,其名称以“ntextBox”开头,并将它们的值一起添加

     

使用LINQ执行相同的操作

     

通过“Controls.Find(”ntextBoxX“,false)”单独访问它们,其中X是课程编号。

我会更好地展示LINQ方法。

TextBox

我没有测试过代码,但应该可以使用。告诉我是否有任何问题。

编辑:经过测试,确实有效。为了完整起见,我将向TextBox添加循环添加一些事件逻辑,以确保它们的输入实际上是数字。

int sum = Controls.Cast<Control>().Sum(c => c.Name.StartsWith("ntextBox") ? int.Parse(c.Text) : 0);

在其他地方,添加此方法:

tbox.TextChanged += HandleNTextBoxInput; // add this line

enter image description here

答案 1 :(得分:0)

正如我在评论中提到的那样,这段代码对我来说似乎太高级了。

我添加控件没有问题,但是仍然存在如何从按钮单击到文本框获取总和的问题。

我可能犯了一些简单的错误,或者有些东西丢失但我真的不知道如何解决这个问题。

我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace testprogram
{
public partial class Form1 : Form
{


    public Form1()
    {
        InitializeComponent();
    }



    private void button1_Click(object sender, EventArgs e) // I'm guessing something is missing over here

    {
        int sum = Controls.Cast<Control>().Sum(c => c.Name.StartsWith("ntextBox") ? int.Parse(c.Text) : 0);


    }
    void HandleNTextBoxInput(object sender, EventArgs e)
    {
        string text = ((TextBox)sender).Text;
        if (!Regex.IsMatch(text, "^[1-9][0-9]*$")) //Text is NOT numeric. Remove [1-9] if you want to keep leading zeros.
        {
            //Set the Text to 0, for example. Or show a message box. Or whatever.
            ((TextBox)sender).Text = "0";
        }
    }
    private int _oldNUDvalue = 0; //or assign it to the default value
    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        {
            int delta = (int)numericUpDown1.Value - _oldNUDvalue;
            if (delta < 0)
            {
                for (int i = -delta; i > 0; i--)
                {
                    var tbox = Controls.Find("ntextBox" + (_oldNUDvalue - i), false)[0];
                    Controls.Remove(tbox);
                }
            }
            else if (delta > 0)
            {
                for (int i = _oldNUDvalue; i < _oldNUDvalue + delta; i++)
                {
                    var tbox = new TextBox();
                    tbox.Location = new Point(15, 55 + (30 * i));
                    tbox.Name = "ntextBox" + i;
                    tbox.TextChanged += HandleNTextBoxInput;
                    Controls.Add(tbox);
                }
            }
            _oldNUDvalue = (int)numericUpDown1.Value;
        }


    }
}

}