After any text has been assigned to the unnamed Text Box associated with the NumericUpdown control, it is not possible to assign a value of zero to the NumericUpDown.
That's not quite right.
What's happening is that the Value of the NumericUpDown is currently at Zero (because that's the initial Value when you dropped it on the Form), but the Text property displays otherwise. Underneath, though, the Value is still zero.
When you attempt to "reset" the NumericUpDown, you assign Zero to it...but the Value is already Zero (underneath the hood), so it doesn't refresh itself (why would it?..under normal operation it's impossible to have non-numeric text displayed inside it). This is evident if you change the value to the Maximum() first, then back to the Minimum():
nud = c as NumericUpDown;
nud.Value = nud.Maximum;
nud.Value = nud.Minimum;
Assuming the Min and Max are not the same number, this will force the NumericUpDown to refresh itself and display the zero.
Now, you can prevent this problem by simply not recursing into the control if it's a TextBox or a NumericUpdown, which are the controls you're interested in resetting. A simple rewrite:
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);
}
}
}