Как удалить компонент из компонента?

Динамически создаю UserControlы и ставлю им панель в качестве парента.
А как их потом с этой панели удалить? И как вообще уничтожить их экземпляры? Ведь нету же метода типа .Free() :thinking:
Есть Dispose(), но он, разумеется, не работает.

А создаются как? У панели есть Control.Controls Property (System.Windows.Forms) | Microsoft Docs с Add и Remove.

Парента самому вроде можно не трогать.

как обычно

MyUserControl u = new MyUserControl();
u.Parent = panel1;

Вспомнил, что у меня есть похожий заброшенный недопиленный проект двухлетней давности с таким же принципом работы и там всё работает. При его написании, такой проблемы не возникало. Сейчас смотрю код. Там тупо Dispose() вызывается и всё работает :open_mouth:
Может вообще в другом месте ошибка? :thinking:

“Как обычно” это вот так: Add controls to Windows forms by Visual C# - C# | Microsoft Docs

panel1.Controls.Add(u);

panel1.Controls.Remove(u);

Хотя Parent вроде бы то же самое делает.

https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Control.cs,3446

        internal virtual Control ParentInternal {
            get {
                return parent;
            }
            set {
                if (parent != value) {
                    if (value != null) {
                        value.Controls.Add(this);
                    }
                    else {
                        parent.Controls.Remove(this);
                    }
                }
            }
        }

если делать это по кнопкам


        private void button1_Click(object sender, EventArgs e)
        {
            FrameYouTubeVideo frame = new FrameYouTubeVideo();
            frame.Parent = panelSearchResults;
            framesVideo.Add(frame);
            StackFrames();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ClearFramesVideo();
        }

        private void ClearFramesVideo()
        {
            foreach (FrameYouTubeVideo frame in framesVideo)
            {
                frame.Dispose();
            }
            framesVideo.Clear();
        }

то работает. Значит, надо копаться, после выполнения какого кода перестаёт работать. Эта ситуация очень напоминает Delphi.
Всё, нашел ошибку. Я просто в IntelliSense промахнулся и не тот метод вызвал :flushed: А код рабочий был.