получил ошибку Переменная <имя переменной> либо не объявлена, либо никогда не была назначена - PullRequest
6 голосов
/ 16 декабря 2009

Я реализую большую форму в winforms C # с Visual Studio 2008. после работы с большой частью диалогового окна, когда я пытаюсь открыть конструктор, он начинает показывать множество сообщений об ошибках, как в заголовке.

"Переменная либо необъявлена, либо никогда не назначалась"

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

Ответы [ 8 ]

6 голосов
/ 16 декабря 2009

Первая рекомендация: . Не используйте любую сложную логику в форме Конструктор , но в форме Событие загрузки (или переопределение метода OnLoad)

Дизайнер использует код конструктора для отображения формы, и если у вас есть ошибки, ваша форма будет "не отображаться" в конструкторе VS.

Во-вторых, каждый раз, когда у вас возникают проблемы в конструкторе, закрывайте его и перестраивайте проект вашей формы. Проверьте ошибки и предупреждения в окне списка ошибок. После исправления снова откройте форму в режиме desig.

4 голосов
/ 20 декабря 2009

Я нашел рабочее решение:

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

Я создал отдельную библиотеку управления Windows для всех пользовательских элементов управления и ... дизайнер показал диалоговое окно.

3 голосов
/ 14 февраля 2013

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

Дизайнер просто не создает строку в верхней части InitializeComponent():

 this.customControl1 = new Controls.CustomControl();

Фактически, если я вручную вставлю строку выше, она удаляется при перестроении проекта.

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

public MyForm()
{
    // HACK: work around VS bug
    this.customControl1 = new Controls.CustomControl();
    InitializeComponent();
}

Излишне говорить, что дизайнер работает большую часть времени. Я не нашел способа последовательно воспроизвести проблему, но интересно удалить форму из решения и воссоздать ее с тем же именем + пользовательский элемент управления, проблема все еще существует.

2 голосов
/ 20 мая 2014

Эта ошибка также произошла для одной из наших форм, и нам было очень трудно определить причину. Код формы был на самом деле в 3x .cs файлах. Базовый form.cs, designer.cs и форма были расширены (она была объявлена ​​как частичный класс).

Итак, MyForm.cs:

namespace MyNamespace
{
    public partial class MyForm : Form
    {
        // Some variable declarations

        // Some method declarations
    }
}

MyForm.designer.cs:

namespace MyNamespace
{
    partial class MyForm
    {
        #region Auto Generated
        protected override void Dispose(bool disposing)
        {
            // Generated dispose code here
        }

        private void InitializeComponent()
        {
            // Generated designer code here

            // Error 'The variable <variable name> is either undeclared or was never assigned' points to one of the lines in here.
        }

        #endregion
    }
}

MyForm.Extended.cs:

namespace MyNamespace
{
    public partial class MyForm
    {
        // Some variable declarations

        // Some method declarations
    }
}

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

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

1 голос
/ 08 июля 2014

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

Теоретически, место для любых сложных инициализаций должно быть обработчиком события Load или OnLoad (). Однако в VS2010 использование события Load элемента управления (или OnLoad ()) недостаточно.

Если ваш UserControl находится в той же сборке, что и форма, которая его использует, и вы хотите просмотреть форму в Designer, VS2010 не только выполняет конструктор UserControl, но также его OnLoad () или Load событие. Кажется, что это не всегда происходит, но когда Дизайнеру нужно перестроить форму.

Так что, если у вас есть какая-то сложная логика или вы используете внешние ресурсы, такие как база данных, она может выдать эту ошибку при открытии Designer для вложенной формы. Это плохо, потому что использование события Load должно быть правильным местом для этого.

Возможно, вам придется использовать отложенную инициализацию для любых важных ресурсов, которые вы должны инициализировать перед запуском формы.

например:.

public class MyUserControl: UserControl
{
    ...

    private List<MyObject> myObjects = null;
    private List<MyObject> MyObjects 
    { 
        get
        {
            if (myObjects == null)
            {
                // lazy initialisation here
                using (var dbContext = new MyVerySpecialDatabaseContext())
                {
                    myObjects = dbContext.MyObjects.ToList();
                }
            }
            return myObjects;
        }
    }

    public MyUserControl()
    {
        InitializeComponent();

        this.Load += new System.EventHandler(this.MyUserControl_Load);

        ... // more UI initialization, but no complicated logic here
    }

    private void MyUserControl_Load(object sender, EventArgs e)
    {
        this.myDataBindingSource.DataSource = MyObjects;
    }
}
0 голосов
/ 17 ноября 2016

В моем случае это зависит от платформы, для которой я создаю проект. Для x86 все было правильно, но для x64 я получил эту ошибку. Поэтому я решил разработать проект под Debug / x86, а затем собрать его для всех необходимых целевых платформ.

0 голосов
/ 21 ноября 2014

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

Например:

private ComponentResourceManger resources = null;

private void InitializeComponent() {
  resources = new ComponentResourceManager(typeof(MainForm));
  ...
}

Будет обычно сломать вашего дизайнера. Иногда это работает, но обычно это путает .. может переименовать все ваши встроенные ресурсы или даже удалить их. Имеет смысл иметь одну копию изображения в вашем файле .resx, но дизайнеру нравится видеть одну копию для каждого элемента управления. Даже если им поделились .. он любит делать копии.

Типичные ошибки: «Невозможно найти« MainForm »» и позже ». Получите некоторый NPE для ресурсов. Даже если у .resx есть его с указанным точным именем файла.

Обходной путь обычно всегда гарантированно работает, если вы создаете экземпляр obj в подпрограмме InitializeComponent ().

private void InitializeComponent() {
  ComponentResourceManager resources = new ComponentResourceManager(typeof(MainForm));
  ...
}

Как вы будете ссылаться на это внешне, зависит от вас.

0 голосов
/ 16 декабря 2009

Проверьте ваш файл designer.cs. Возможно, отсутствуют контрольные объявления.

Ваш код собирается и запускается?

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