Странное поведение Form.Controls.OfType - PullRequest
0 голосов
/ 25 мая 2018

У меня есть Форма, которая создается во время выполнения, когда пользователь вводит некоторые данные и либо отправляет данные, либо отменяет их.Форма состоит из 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);
        }
    }

Я совершенно запутался в этом.Я пропускаю что-то простое?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...