首页 > 解决方案 > Form.Controls.OfType 的奇怪行为

问题描述

我有一个在运行时构建的表单,用户在其中输入一些数据并提交数据或取消。表单由一个带有控件的 TableLayoutPanel 组成。

我添加了提交和取消按钮,如下所示。

TableLayoutPanel panel = new TableLayoutPanel
{
       ColumnCount = 3,
       RowCount = gridObj.ColList.Count() + 1,
       Height = 800,
       Width = 800
 };

//other controls for user input...

    Button submitButton = new Button();
    submitButton.Text = "Submit";
    submitButton.Click += (sender, EventArgs) => { SubmitClick(sender, EventArgs, gridObj); };
    panel.Controls.Add(submitButton, 0, CurrentRow);
    this.AcceptButton = (submitButton);

    Button CancelButton = new Button();
    CancelButton.Text = "Cancel";
    panel.Controls.Add(CancelButton, 3, CurrentRow);
    this.CancelButton = (CancelButton);

有时需要从表单中删除按钮。我使用以下代码这样做。

private void RemoveExistingButtons(TableLayoutPanel panel)
    {
        foreach (Control ctrl in panel.Controls.OfType<Button>())
        {
            panel.Controls.Remove(ctrl);
        }
    }

在我看来,这应该找到并从面板中删除每个按钮。但是它只删除了提交按钮。取消按钮不会被移除。

我正在玩它并通过添加另一个foreach,取消按钮被第二个foreach删除。

private void RemoveExistingButtons(TableLayoutPanel panel)
    {
        foreach (Control ctrl in panel.Controls.OfType<Button>())
        {
            panel.Controls.Remove(ctrl);
        }
        foreach (Control ctrl in panel.Controls.OfType<Button>())
        {
            panel.Controls.Remove(ctrl);
        }
    }

我已经用其他控件类型测试了这种方法,他们成功地删除了多个控件,只有一个循环,它“应该”工作的方式。

 private void RemoveExistingControls(TableLayoutPanel panel)
    {
        foreach (Control ctrl in panel.Controls.OfType<Label>())
        {
            panel.Controls.Remove(ctrl);
        }
        foreach (Control ctrl in panel.Controls.OfType<TextBox>())
        {
            panel.Controls.Remove(ctrl);
        }
    }

我对此感到很困惑。我忽略了一些简单的事情吗?

标签: c#.netwinforms

解决方案


推荐阅读