我在使用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#;)我确实意识到我的问题可能很愚蠢,但我自己无法处理这个问题。
提前感谢您的时间和帮助。
答案 0 :(得分:0)
如果您之后需要访问它们,您有一些选择。 我猜你的目标是将label1的文本设置为指定文本框中包含的值的总和。
在ValueChanged
的{{1}}事件中,检查 delta ,然后向NumericUpDown
添加或删除所需数量的TextBoxes
是Form
。要获取 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
答案 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;
}
}
}
}