与未命名的TextBox关联的NumericUpDown

时间:2013-11-19 15:04:25

标签: c# numericupdown

我一直试图调试一个表格大约15个小时,终于发现了问题所在。似乎所有NumericUpDown控件都有一个未命名的关联TextBox控件。我的问题可以转载如下:

  1. 使用单一表单创建新项目
  2. 在表单
  3. 上放置一个按钮,一个TextBox和一个NumericUpDown
  4. 在表单

    中使用以下代码
    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");
    }
    
  5. 将表单的加载事件和按钮的click事件分配给代码中的处理程序

  6. 运行表单

  7. 最初,NumericUpDown控件包含文本“Something”。如果单击该按钮,则不会分配新值0。

    但是,如果在按钮的click事件中为NumericUpDown Value属性指定了一个非零值:

    nud.Value = 42;
    

    按钮按预期工作。

    将任何文本分配给与NumericUpdown控件关联的未命名文本框后,无法为NumericUpDown指定零值。

    我在许多地方使用这样的递归代码来填充和重置表单。现在我知道问题出在哪里,我可以通过检查一个未命名的TextBox来解决它:

    if (c is TextBox && c.Name != "")
    

    但这看起来很丑陋且可能容易出错。

    我误解了什么吗?在循环控件时是否有更简洁的方法来处理这些虚假的TextBox?

1 个答案:

答案 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);
            }
        }
    }