Удалите все динамически созданные PictureBox с тем же родителем в C # - PullRequest
0 голосов
/ 24 сентября 2018

Я пишу приложение Windows Forms на C #, в котором я динамически создаю TextBoxes и PictureBoxes с Panel в качестве родителя:

PictureBox pb = new PictureBox();
pb.Parent = MainPanel;
pb.Name = "pb" + "r" + NumberInRow + "c" + NumberInColumn+ "bi" + buildIndex;
pb.Location = new Point(30 * NumberInRow + 192 * (NumberInRow - 1), 50 * NumberInColumn + 273 * (NumberInColumn - 1));
pb.ImageLocation = ThumbLinks[i];

TextBox tb = new TextBox();
tb.Parent = MainPanel;
tb.Name = "tb" + "r" + NumberInRow + "c" + NumberInColumn + "bi" + buildIndex;
tb.Location = new Point(pb.Location.X - 4, pb.Location.Y + pb.Size.Height + 5);
tb.Text = GalleryNames[i];

Я пытаюсь удалить их следующим образом:

foreach (PictureBox pb in MainPanel.Controls)
    {
                MainPanel.Controls.Remove(pb);
    }

foreach (TextBox tb in MainPanel.Controls)
     {
                MainPanel.Controls.Remove(tb);
     }

Кажется, это работает только один раз.Visual Studio говорит мне, что она не может конвертировать System.Windows.Forms.TextBox в System.Windows.Forms.PictureBox.

Есть ли способ удалить PictureBoxes и TextBoxes по-разному?

Я читал о чем-то вроде MainPanel.Children.Remove(); но, похоже, его нет или я делаю что-то не так.

Ответы [ 2 ]

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

Посмотрите на MainPanel.Controls.OfType<PictureBox>() и MainPanel.Controls.OfType<TextBox>().Вы можете использовать это вместе с вызовом .ToList(), чтобы избежать изменения интегратора, пока он еще активен:

var PBs = MainPanel.Controls.OfType<PictureBox>().ToList();
var TBs = MainPanel.Controls.OfType<TextBox>().ToList();
foreach (var pb in PBs)
{
    MainPanel.Controls.Remove(pb);
}
foreach (TextBox tb in TBs)
{
    MainPanel.Controls.Remove(tb);
}
0 голосов
/ 24 сентября 2018
foreach (var control in MainPanel.Controls
                        .Where(c => c is PictureBox) || c is TextBox)
{
     MainPanel.Controls.Remove(control);
}

Это удалит каждый элемент типов, PictureBox и TextBox.Конечно, проблема с этим кодом заключается в том, что вы изменяете коллекцию при ее перечислении.

Одним из подходов к решению этой проблемы может быть создание коллекции элементов управления для удаления сначала

var controls = MainPanel.Controls.Where(c => c is PictureBox || c is TextBox).ToList();

, а затем перечисление этой коллекции с удалением каждого элемента из Panel.

foreach (var toRemove in controls)
     MainPanel.Controls.Remove(toRemove);

Также было бы полезно убедиться, что элемент удален из пользовательского интерфейса в правильном потоке

delegate void RemoveControlDelegate(Control controlToRemove);

private void RemoveControl(Control control)
{
   if (InvokeRequired)
   {
       BeginInvoke(new RemoveControlDelegate(RemoveControl), control);
   }
   else
   {
       MainPanel.Controls.Remove(control);
   }
}

foreach (var toRemove in controls)
     RemoveControl(toRemove);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...