Дизайнер Visual Studio WinForms не создает объект - PullRequest
3 голосов
/ 05 февраля 2009

Я создал класс, производный от класса System.Windows.Forms.ContextMenuStrip, а не как пользовательский элемент управления, а всего лишь простой класс .cs с конструктором и одним обработчиком событий.

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

Таким образом, во время выполнения я получаю «Ссылка на объект не установлена ​​на экземпляр объекта.», Потому что дизайнер никогда не генерирует строку:

this.searchGridContextMenu1 = new SearchGridContextMenu ();

внутри InitializeComponent.

Раньше он генерировал эту строку, по сути, я продолжаю помещать ее обратно из своего хранилища Vault, но дизайнер просто "съедает" ее снова.

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

Ответы [ 5 ]

6 голосов
/ 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, и ваша проблема часто исчезнет.

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

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

Сет

3 голосов
/ 13 июля 2011

Я правильно прочитал? Visual Studio удаляет строку, которая создает экземпляр вашего элемента управления?

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

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

1 голос
/ 15 февраля 2010

Эта проблема возникает, когда InitializeComponent () пересекается с базовыми и унаследованными компонентами. Решение - вызвать метод конструктора компонента. В противном случае будет вызван базовый метод.

public Form()
{
    this.InitializeComponent(); 
    // base.InitializeComponent <-- default one is thisone
}
1 голос
/ 05 февраля 2009

Наследование от управления недостаточно. Это тот самый минимум, который мне пришлось реализовать, чтобы заставить его работать:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WinForms
{
    class Foo : System.Windows.Forms.ContextMenuStrip
    {
        public Foo()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }

        #endregion
    }
}
0 голосов
/ 29 августа 2018

Изменение моего конструктора без параметров с внутреннего на общедоступное решило проблему

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