我一直试图调试一个表格大约15个小时,终于发现了问题所在。似乎所有NumericUpDown控件都有一个未命名的关联TextBox控件。我的问题可以转载如下:
在表单
中使用以下代码private int testing = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Mytest(this);
}
private void button1_Click(object sender, EventArgs e)
{
NumericUpDown nud;
foreach (Control c in this.Controls)
{
if (c is TextBox)
{
c.Text = "that";
}
if (c is NumericUpDown)
{
nud = c as NumericUpDown;
nud.Value = 0;
}
}
}
private void TestEmpty(Control ctl)
{
foreach (Control c in ctl.Controls)
{
if (c is TextBox && c.Name == "")
{
++testing;
c.BackColor = Color.Red;
c.Text = "Something";
}
TestEmpty(c);
}
}
private void Mytest(Control ctl)
{
TestEmpty(this);
MessageBox.Show("Found " + testing.ToString() + " items");
}
将表单的加载事件和按钮的click事件分配给代码中的处理程序
运行表单
最初,NumericUpDown控件包含文本“Something”。如果单击该按钮,则不会分配新值0。
但是,如果在按钮的click事件中为NumericUpDown Value属性指定了一个非零值:
nud.Value = 42;
按钮按预期工作。
将任何文本分配给与NumericUpdown控件关联的未命名文本框后,无法为NumericUpDown指定零值。
我在许多地方使用这样的递归代码来填充和重置表单。现在我知道问题出在哪里,我可以通过检查一个未命名的TextBox来解决它:
if (c is TextBox && c.Name != "")
但这看起来很丑陋且可能容易出错。
我误解了什么吗?在循环控件时是否有更简洁的方法来处理这些虚假的TextBox?
答案 0 :(得分:3)
将任何文本分配给关联的未命名文本框后 使用NumericUpdown控件时,无法分配值 为NumericUpDown为零。
那不太对。
发生的事情是NumericUpDown的 Value 当前为零(因为这是将其放在Form上时的初始值),但Text属性显示为否则。但是,在下面,价值仍为零。
当您尝试“重置”NumericUpDown时,为其分配零...但是值已经为零(在引擎盖下),因此它不会自行刷新(为什么会这样?...在正常操作下它内部不能显示非数字文本)。如果您首先将值更改为Maximum(),然后再更改为Minimum():
,则这一点很明显 nud = c as NumericUpDown;
nud.Value = nud.Maximum;
nud.Value = nud.Minimum;
假设Min和Max的数字不同,这将强制NumericUpDown自行刷新并显示零。
现在,如果它是TextBox或NumericUpdown,你可以通过简单地不再递归控件来防止这个问题,它们是你有兴趣重置的控件。一个简单的重写:
private void Reset(Control ctl)
{
foreach (Control c in ctl.Controls)
{
if (c is TextBox)
{
c.Text = "";
}
else if (c is NumericUpDown)
{
NumericUpDown nud = c as NumericUpDown;
nud.Value = nud.Minimum;
}
else if (c.HasChildren)
{
Reset(c);
}
}
}