【发布时间】:2012-06-07 16:56:14
【问题描述】:
我有几个普通的 Windows 窗体。要清除其中一个中的数据输入字段,我使用如下代码:
ClearInputFields(this);
private void ClearInputFields(Control Page)
{
try
{
foreach (Control ctrl in Page.Controls)
{
if (ctrl is Button)
continue;
if (ctrl is DataGridView)
continue;
if (ctrl is ListBox)
continue;
if (ctrl is TextBox)
{
((TextBox)(ctrl)).Text = string.Empty;
}
else if (ctrl is ComboBox)
{
((ComboBox)(ctrl)).SelectedIndex = 0;
}
else if (ctrl is CheckBox)
{
((CheckBox)(ctrl)).Checked = false;
}
else if (ctrl.Controls.Count > 0)
{
ClearInputFields(ctrl);
}
}
}
catch (Exception ex)
{
TraceFile.Error("ExceptionLog", ex);
}
}
在其中一种形式上,它按预期工作。在另一种形式中,九个 ComboBox 中的两个没有被重置,六个 CheckBox 中的任何一个都不会被清除。
在调试器中单步执行,似乎特定控件甚至不在表单中包含的控件列表中。?!
我比较了表单,发现这些控件的属性没有什么不同。无法识别的组合框之一是数据绑定的,一个不是,但对于那些被重置的组合框也是如此。
我看过设计器,所有控件都声明为“this.Controls.Add(this.name_of_control);”
我已尝试省略最后一个“else if”(无论如何,此表单上没有面板、组框或其他容器)。行为上没有区别。
如果我明确地将复选框设置为“Checked = false”,并将 ComboBoxes 设置为“SelectedIndex = 0”,它们会按照我的预期执行,但在遍历表单控件时不会。
编辑 - 附录:所有控件都是在设计器中创建的,而不是在运行时创建的。如前所述,表单上没有容器。
我希望这是您眼皮底下的那些简单、明显的问题之一,但到目前为止我还没有看到它。
感谢任何见解。谢谢!
【问题讨论】:
-
您是否在运行时创建任何控件?比较 Page.Controls.Count
-
你的其他控件里面是否包含控件?您可能必须具有查找包含控件然后重新执行传递它的容器的逻辑。
-
@SASS_Shooter 代码已经在这样做了。它是递归的。
-
此代码将触发事件处理程序。如果您对事件处理程序中控件的 Z 顺序执行任何操作,那么您将遇到此问题。并注意例外情况。
-
啊哈!在某些情况下,我正在使用事件处理程序,但不是以任何有意或已知的方式改变任何事物的 Z 顺序。但是,这确实给了我改变方法的提示。