The answer from nothingIsNecessary was pretty close but I still had to look around to get it working.
Namely, the issue was
AddOnChangeHandlerToInputControls(panelFormContainer);
should be
AddOnChangeHandlerToInputControls(this);
panelFormContainer wasn't working nor could I find documentation for it.
Reference: Loop through all controls on a form,even those in groupboxes
I also went ahead and added more control types as I needed them.
I used MouseCaptureChanged for datePicker since the checkbox would sometimes fire ValueChanged and sometimes it wouldn't. ¯_(ツ)_/¯
private void AddOnChangeHandlerToInputControls(Control ctrl)
{
foreach (Control subctrl in ctrl.Controls)
{
if (subctrl is TextBox)
{
((TextBox)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is CheckBox)
{
((CheckBox)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is RadioButton)
{
((RadioButton)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is ListBox)
{
((ListBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is ComboBox)
{
((ComboBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is MaskedTextBox)
{
((MaskedTextBox)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is DateTimePicker)
{
((DateTimePicker)subctrl).MouseCaptureChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is RichTextBox)
{
((RichTextBox)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is NumericUpDown)
{
((NumericUpDown)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
}
else
{
if (subctrl.Controls.Count > 0)
{
this.AddOnChangeHandlerToInputControls(subctrl);
}
}
}
}