0

我对使用 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;
}

}

现在的问题是我不知道如何为生成的文本框分配名称。(在改进之前,我可以将它们命名为 - 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# ;) 我确实意识到我的问题可能很愚蠢,但我自己无法解决这个问题。

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

4

2 回答 2

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


    }
}

}

于 2013-08-05T12:44:08.703 回答
0

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

ValueChanged您的情况下NumericUpDown,检查增量并随后添加或删除所需数量的TextBoxesFormControls。要获得delta,您需要存储 的先前值NumericUpDown,然后从当前值中减去它。(如果是 5,现在是 4,4 - 5 = -1。一个文本框已被删除)。

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

但是,如果您最多只有 3 个,则可以采取稍微不同的方法。我的解决方案适用于n-textboxes

最后,要从代码中获取TextBoxes 的值,您有三种方法:

遍历表单的控件,检查名称以“ntextBox”开头的文本框,然后将它们的值相加

使用 LINQ 做同样的事情

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

我将展示 LINQ 方法,因为我更喜欢它。

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

我还没有测试过代码,但它应该可以工作。告诉我是否有任何问题。

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

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

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

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";
    }
}

在此处输入图像描述

于 2013-08-04T22:58:45.117 回答