0

我有几个普通的 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”,它们会按照我的预期执行,但在遍历表单控件时不会。

编辑 - 附录:所有控件都是在设计器中创建的,而不是在运行时。如前所述,表单上没有容器。

我希望这是您眼皮底下那些简单、明显、直接的问题之一,但到目前为止我还没有看到它。

任何见解表示赞赏。谢谢!

4

2 回答 2

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 的副本,然后在重置后将其与页面的 Controls 集合进行比较。

于 2012-06-08T05:58:13.407 回答
0

也许在更改控件的属性时 - 控件的顺序发生了this.Controls变化,因此您不会遍历所有控件。虽然可能不是这种情况,因为可能Control ctrl in Page.Controls只是第一次检查。

于 2012-06-07T18:29:54.923 回答