Почему это удаляет все остальные флажки? - PullRequest
0 голосов
/ 28 сентября 2018

Ранк Нуб снова изучает C # с Winforms.Я тренировался добавлять флажки на панель, а затем снимать их.Кнопка «start_button» добавляет флажки.Это работает.Кнопка «remove_button» должна удалить их все.Но это не так.Поиграв с # флажками, я понял, что он снимает все остальные флажки.Еще один щелчок, и он удаляет все остальные из оставшихся, и так далее, пока все они не исчезнут.

Почему?

Спасибо, Арам

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace playingWithPanels
{
public partial class Form1 : Form
{
    CheckBox chkBox;
    TextBox txtBox;
    public Form1()
    {
        InitializeComponent();
    }


    private void start_button_Click(object sender, EventArgs e)
    {
        txtBox = new TextBox();
        txtBox.BringToFront();
        txtBox.Text = "Textbox";
        txtBox.Location = new Point(30, 10);
        panel1.Controls.Add(txtBox);
        for (int i =0;i<20;i++)
        {
        chkBox = new CheckBox();
        chkBox.BringToFront();
        chkBox.Text = "Checkbox_" + i.ToString();
        chkBox.Name = "Checkbox_" + i.ToString();
            chkBox.AutoSize = true;
        chkBox.Location = new Point(30, 40 + 25 * i);
        panel1.Controls.Add(chkBox);
        }
    }

    private void remove_button_Click(object sender, EventArgs e)
    {
        foreach (var ctrl in panel1.Controls.OfType<CheckBox>())
        {
            panel1.Controls.Remove(ctrl);
        }
    }
}
}

1 Ответ

0 голосов
/ 28 сентября 2018

Потому что вы используете итератор и изменяете коллекцию во время этого.Используйте следующий подход:

    var controls = panel1.Controls.OfType<CheckBox>().ToArray();
    foreach (var ctrl in controls)
    {
        panel1.Controls.Remove(ctrl);
    }
...