我有几个普通的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);"
我试过遗漏最后一个"否则如果" (无论如何,此表格上没有面板,组合框或其他容器)。行为没有区别。
如果我明确将Checkbox设置为" Checked = false",并将ComboBoxes设置为" SelectedIndex = 0"他们按照我的预期行事,但在迭代表格的控件时却没有。
编辑 - 附录:所有控件都在Designer中创建,而不是在运行时创建。如上所述,表格上没有容器。
我希望这是一个简单,明显,正确的问题之一,但到目前为止,我还没有看到它。
任何见解都表示赞赏。谢谢!
答案 0 :(得分:0)
也许在更改控件的属性时 - this.Controls
中控件的顺序会发生变化,因此您不会通过所有控件。虽然可能情况并非如此,因为可能只是第一次检查Control ctrl in Page.Controls
。
答案 1 :(得分:0)
每当我必须对可能改变它的Collection的项目执行某些操作时,我通常会复制该集合,然后遍历此副本。在你的情况下,这是我经常写的代码:
ClearInputFields(this);
private List<Control> ControlsForPage(Control Page)
{
List<Control> result = new List<Control>();
foreach (Control ctrl in Page.Controls)
result.Add(ctrl);
return result;
{
private void ClearInputFields(Control Page)
{
try
{
List<Control> ctrlsCopy = ControlsForPage(Page);
foreach (Control ctrl in ctrlsCopy)
{
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);
}
}
无论如何,只是要了解这里发生了什么,我会在重置之前尝试制作控件的副本,然后在重置后将其与页面的Controls集合进行比较。