Щелчок и перетаскивание пользовательского элемента управления в VB .NET создает сообщение об ошибке ссылки на объект - PullRequest
1 голос
/ 13 декабря 2008

Не удалось создать компонент «Пользовательский контроль 1». следующее сообщение об ошибке:

'System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта. at System.ComponentModel.ReflectPropertyDescriptor.SetValue (Компонент объекта, Значение объекта) .............. и т.д ..........

Что мне сделать, чтобы исправить эту ошибку?

Ответы [ 4 ]

8 голосов
/ 04 июня 2009

Когда пользовательский элемент управления не загружается в конструктор Visual Studio, вот что вам нужно сделать. Эти инструкции предназначены для проекта vb.net, но c # должен быть похожим. Кроме того, перед этим закройте все открытые окна (или, по крайней мере, исходные и дизайнерские файлы элемента управления, над которым вы работаете.)

И последнее. Первое, что вы должны сделать, это убедиться, что перезапуск Visual Studio не решит проблему. Если нет, вы можете попробовать следующие шаги. Эти инструкции предполагают, что ошибочные пользовательские элементы управления находятся в проекте библиотеки элементов управления в Visual Studio. Если нет, то вы должны немного отрегулировать направления, чтобы заставить его работать, но гораздо проще, когда элемент управления находится в своем собственном проекте.

Выполните следующие действия:

  1. Сделайте библиотеку управления вашим проектом запуска.
  2. Откройте свойства для проекта библиотеки управления и нажмите на вкладку отладки.
  3. В разделе «Действие запуска» выберите параметр «Запустить внешнюю программу» и найдите исполняемый файл Visual Studio.

ПРИМЕЧАНИЕ: это означает, что когда вы запускаете свое решение, оно запускает другой экземпляр Visual Studio вместо фактического запуска вашего решения. Первый экземпляр Visual Studion (INSTANCE_1) будет «размещать» второй экземпляр Visual Studio (INSTANCE_2) при его запуске.

  1. Запустите ваше решение. INSTANCE_2 загрузится.
  2. Переключиться обратно на INSTANCE_1.
  3. В INSTANCE_1 нажмите CTRL-ALT-E. Это откроет диалоговое окно исключений. Установите флажок В столбце THROWN рядом с Общими исключениями времени выполнения языка.

ПРИМЕЧАНИЕ. Это гарантирует, что INSTANCE_1 будет BREAK при ЛЮБОЙ ошибке времени выполнения, даже если он попадет в блок try.

  1. Переключиться на INSTANCE_2. В Solution Explorer дважды щелкните, чтобы открыть ошибочный пользовательский элемент управления.

Вы должны обнаружить, что INSTANCE_1 OF Visual Studio должен был остановиться на строке кода, из-за которой конструктор не загружал элемент управления. Исправьте код (который обычно означает тестирование для IsNot Nothing, прежде чем ссылаться на свойства объекта ..., но может означать и другие вещи.)

Кроме того, иногда я обнаруживаю, что элемент управления будет загружаться в INSTANCE_2, а не прерываться при ошибке в INSTANCE_1. В этом случае просто прекратите отладку ... закройте INSTANCE_2. Сохраните / перезапустите INSTANCE_1, и ваша проблема часто исчезнет.

Урок такой. Пользовательский элемент управления ДОЛЖЕН иметь возможность загружать / ссылаться на все объекты и их элементы, чтобы загрузить его в конструктор. Поэтому для пользовательских элементов управления, которые будут помещены в другие контейнеры, я обычно создаю события для уведомления родителя, а не для того, чтобы пытаться вставить объекты в дочерний элемент управления.

Надеюсь, что это поможет для дальнейшего использования этого старого вопроса.

Сет

2 голосов
/ 16 декабря 2008

Вместо ошибки, возникающей при открытии формы для редактирования, похоже, что это происходит, когда вы уже редактируете форму и добавляете новые пользовательские элементы управления. Статья CodeProject , о которой упоминалось ранее, показывает, что делать в случае некорректной загрузки формы, а не конкретного пользовательского элемента управления.

Имеет ли ваш пользовательский элемент управления какие-либо свойства, которые сопоставляются с пользовательскими объектами (т. Е. Не Integer или String)? Если это так, конструктор форм попытается загрузить ваши свойства в редакторе свойств. Если показ свойств приводит к ошибке, конструктор форм покажет вам это. Я думаю, что это то, что происходит с вашим пользовательским контролем.

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

0 голосов
/ 12 декабря 2014

Я обнаружил, что эта ошибка часто возникает, когда контрольные библиотеки не собираются должным образом. В 95% случаев это можно исправить, просто перезапустив Visual Studio.

0 голосов
/ 07 сентября 2009

Спасибо, Сет, за этот пост! Ваше решение помогло мне исправить ошибку. Единственное, что я хотел бы добавить к этому, это то, что когда загружается «INSTANCE_2», вам может потребоваться загрузить файл проекта в INSTANCE_2. Мне нужно было, потому что я не имел дело с библиотекой элементов управления, а вместо этого имел пользовательские элементы управления, определенные в том же проекте, в котором находились формы. Как только я загрузил проект в INSTANCE_2, я открыл ошибочную форму, и это вызвало INSTANCE_1 для всплывающее окно с ошибочным кодом в пользовательском элементе управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...