Пользовательский элемент управления Winform Почему «Ссылка на объект не установлена ​​для экземпляра объекта»? - PullRequest
1 голос
/ 03 декабря 2010

Я создал пользовательский элемент управления с максимальным значением.При добавлении if (DesignMode) Parent.Refresh ();компилируется, но в клиенте вылетает с сообщением об ошибке:

Ссылка на объект не установлена ​​на экземпляр объекта

Стек вызовов:

at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
at Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkPropertyDescriptor.SetValue(Object component, Object value)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializePropertyAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement, CodePropertyReferenceExpression propertyReferenceEx, Boolean reportError)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement) 

Исходный код:

[Category("Main")]
[Description("Max Value")]
[DefaultValue(100)]
public int Max
{
    get { return _max; }
    set { 
        _max = value;
        if (DesignMode)
        {
            Parent.Refresh();
        }
    }
}

Ответы [ 4 ]

5 голосов
/ 03 декабря 2010

попробуйте это:

if (DesignMode && Parent != null)
{
    Parent.Refresh();
}

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

Если вы посмотрите на * .designer.cs вашей формы, вы заметите, что свойства вашего usercontrol присваиваются до того, как добавляется в родительскую форму.Вот почему вы получаете исключение.

2 голосов
/ 24 октября 2014

У меня была похожая проблема.Код компонента вызвал эту ошибку.Простое решение в моем случае заключалось в инкапсуляции всего кода, который работает с графическими компонентами:

if (this.Created)
{
  // insert code with other components here
}

К сожалению, это решение не работает правильно с управлением вкладками (когда компонент не находится на первой видимой вкладке) .

В моем случае проблема была вызвана имуществом.Свойство имеет активную инициализацию дочерних компонентов.Окончательное решение:

[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
[Category("Main")]
[Description("...")]
[DefaultValue(MyDataClass.None)]
public MyDataClass Data
{
  get
  {
    return this.data;
  }
  set
  {
    if (object.ReferenceEquals(value, null))
      value = MyDataClass.None; // not null - valid state of no data
    if (this.Created)
    {
      this.textEdit.Text = value.ToString();
    }
    this.data = value;
  }
}

protected override void OnVisibleChanged(EventArgs e)
{
  base.OnVisibleChanged(e);
  if (!this.DesignMode)
    this.Data = this.data;
}

Для устранения ошибки используйте либо [Browsable(false)], либо переопределите OnVisibleChanged.

0 голосов
/ 05 марта 2019

Я просто запускаю код и открываю эту форму из соответствующего меню.Затем сделали снимок экрана и сохраните изображение.Затем отправился в обозреватель решений, открыл файл .designer.cs, скопировал код и сохранил его в блокноте.Теперь снова откройте дизайнер и нажмите «Игнорировать и продолжить» и подтвердите его.Это сработало для меня.Но если у вас отсутствует какой-либо элемент управления, вы можете создать этот элемент управления путем перетаскивания и просмотра сохраненного снимка экрана и файла .designer.cs, чтобы элемент управления остался прежним.

0 голосов
/ 03 декабря 2010

Вы также должны проверить NULL на Parent, а также убедиться, что вы устанавливаете объект Parent, иначе Parent.Refresh () никогда не будет выполнен.

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