Я пытаюсь создать программу настроек для проекта, над которым работаю, и мне нужен способ выгрузки объектов (в частности, графических блоков и меток). Вероятно, эти объекты понадобятся мне позже, но я не хочу, чтобы они постоянно загружались в память, потому что я хочу сделать свою программу максимально облегченной.
Я пробовал обнулить свои объекты, и они обнуляются, но теперь я не могу их ПЕРЕзагрузить.
Вот код:
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;
}
}
}
Да, ты прав.
Это элементы управления. Обычно вы Dispose()
из них (не просто устанавливайте экземпляр в null
, это очень важно). Затем, когда вам понадобится больше экземпляров, вы new
их. Если этот процесс продолжится, создайте свою собственную фабрику.
Я попробую это.
Не помогло, до сих пор не появляется.
Добавил код, возможно что-то не так
Похоже, этот код взят из файла .designer.cs
. Не то чтобы это имело большое значение, но непонятно, что звонит LoadPage()
и когда звонит. Вы меняете контейнеры панелей, скажем, на информационной панели? Вы поставили точку останова в этом методе, чтобы увидеть, какие части выполняются? -- Похоже, вы привыкли работать с веб-материалами. Не думайте, что страница (на самом деле здесь нет такого термина) перезагружается, поскольку веб-страница
this.SystemRootIcon.Dispose();
не устанавливает значение SystemRootIcon
равным нулю, поэтому последнее условие if (this.SystemRootIcon == null)
никогда не будет истинным. Вам необходимо явно установить для него значение null после удаления.
Вместо проверки на ноль вы также можете проверить на IsDisposed
. Это может быть немного безопаснее, поскольку оно не включает в себя нулевые тесты и, следовательно, несет меньший риск возникновения исключений NullReferenceException.
Итак, первое условие должно быть примерно таким:
if (this.SystemRootIcon != null)
{
this.SystemRootIcon.Dispose();
this.SystemRootIcon = null;
}
Попробую это, чтобы увидеть, работает ли это.
Оказывается, это было ТАКЖЕ из-за того, как я вызывал LoadPage();. Простите всех за проблемы.
В заголовке говорится: «Невозможно обнулить объект [...]», а в теле вы заявляете: «Я пробовал обнулить свои объекты, и они обнуляются [...]». Название, вероятно, должно быть «Как воссоздать объект [...]», но это означает, что вам придется объяснить, о каких объектах вы говорите.