Невозможно воссоздать объект в .NET Winforms 4.8.1 C#

Я пытаюсь создать программу настроек для проекта, над которым работаю, и мне нужен способ выгрузки объектов (в частности, графических блоков и меток). Вероятно, эти объекты понадобятся мне позже, но я не хочу, чтобы они постоянно загружались в память, потому что я хочу сделать свою программу максимально облегченной.

Я пробовал обнулить свои объекты, и они обнуляются, но теперь я не могу их ПЕРЕзагрузить.

Вот код:

    public void LoadPage(string URL)
    {
        if (URL != currentPage)
        {
            if (this.SystemRootIcon != null)
            {
                this.SystemRootIcon.Dispose();
            }
            if (URL == "Root")
            {
                if (this.SystemRootIcon == null)
                {
                    this.SystemRootIcon = new System.Windows.Forms.PictureBox();
   // Below does not run
                    debug.Text = "RUNNING!";
                    ((System.ComponentModel.ISupportInitialize)(this.SystemRootIcon)).BeginInit();
                    this.splitContainer1.Panel2.Controls.Add(this.SystemRootIcon);
                    this.SystemRootIcon.BackgroundImage = global::New_Control_Panel.Properties.Resources.imageres_195;
                    this.SystemRootIcon.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
                    this.SystemRootIcon.Location = new System.Drawing.Point(12, 42);
                    this.SystemRootIcon.Name = "SystemRootIcon";
                    this.SystemRootIcon.Size = new System.Drawing.Size(48, 48);
                    this.SystemRootIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
                    this.SystemRootIcon.TabIndex = 18;
                    this.SystemRootIcon.TabStop = false;
                    this.SystemRootIcon.Visible = true;
                    ((System.ComponentModel.ISupportInitialize)(this.SystemRootIcon)).EndInit();
                }
                currentPage = URL;
            }
        }
    }

В заголовке говорится: «Невозможно обнулить объект [...]», а в теле вы заявляете: «Я пробовал обнулить свои объекты, и они обнуляются [...]». Название, вероятно, должно быть «Как воссоздать объект [...]», но это означает, что вам придется объяснить, о каких объектах вы говорите.

Jimi 18.08.2024 14:25

Да, ты прав.

Eric William 18.08.2024 14:28

Это элементы управления. Обычно вы Dispose() из них (не просто устанавливайте экземпляр в null, это очень важно). Затем, когда вам понадобится больше экземпляров, вы new их. Если этот процесс продолжится, создайте свою собственную фабрику.

Jimi 18.08.2024 14:40

Я попробую это.

Eric William 18.08.2024 14:51

Не помогло, до сих пор не появляется.

Eric William 18.08.2024 15:01

Добавил код, возможно что-то не так

Eric William 18.08.2024 15:11

Похоже, этот код взят из файла .designer.cs. Не то чтобы это имело большое значение, но непонятно, что звонит LoadPage() и когда звонит. Вы меняете контейнеры панелей, скажем, на информационной панели? Вы поставили точку останова в этом методе, чтобы увидеть, какие части выполняются? -- Похоже, вы привыкли работать с веб-материалами. Не думайте, что страница (на самом деле здесь нет такого термина) перезагружается, поскольку веб-страница

Jimi 18.08.2024 15:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

this.SystemRootIcon.Dispose(); не устанавливает значение SystemRootIcon равным нулю, поэтому последнее условие if (this.SystemRootIcon == null) никогда не будет истинным. Вам необходимо явно установить для него значение null после удаления.

Вместо проверки на ноль вы также можете проверить на IsDisposed. Это может быть немного безопаснее, поскольку оно не включает в себя нулевые тесты и, следовательно, несет меньший риск возникновения исключений NullReferenceException.

Итак, первое условие должно быть примерно таким:

            if (this.SystemRootIcon != null)
            {
                this.SystemRootIcon.Dispose();
                this.SystemRootIcon = null;
            }

Попробую это, чтобы увидеть, работает ли это.

Eric William 18.08.2024 23:02

Оказывается, это было ТАКЖЕ из-за того, как я вызывал LoadPage();. Простите всех за проблемы.

Другие вопросы по теме