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

У меня есть вопрос, связанный с ошибкой в названии. Я работаю с С# и Visual Studio 2010.

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

Sample of errors Все ошибки ссылаются на строки внутри метода InitializeComponent, где значение присваивается такому свойству:

[...]            
this.PanelMargenIzquierdoCapaBase.BackColor = m_ColorCapaBase;
[...]

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

Декларация свойств:

    protected Color m_VariableName;
    public Color VariableName
    {
        get { return m_VariableName; }
        set { }
    }

Код конструктора:

    public FormularioGeneral()
    {
        ConfigurarUI();
        AccionesConstructor();
        InitializeComponent();
        PostInicializacionComponentes();
        EstablecerIcono();
        InicializarLocalizacionFormulario();
    }

Метод ConfigurarUI:

public virtual void ConfigurarUI()
{
        [...]

        m_AltoBordeSuperiorCapaBase = 30;
        m_AltoBordeInferiorCapaBase = 7;
        m_AnchoBordesLateralesCapaBase = 7;

        m_ColorCapaBase = Color.FromArgb(50, 100, 150);
        m_ColorTextoCapaBase = Color.White;
        m_ColorTextoBotonAplicacion = Color.Black;

        m_FuenteTextoIzquierdoCapaBase = new System.Drawing.Font("Verdana", 11.0F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        m_FuenteTextoCentroCapaBase = new System.Drawing.Font("Verdana", 14.0F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        [...]
}

Итак, насколько я знаю, все переменные, которые дают ошибки, правильно объявлены и имеют значение, назначенное до вызова функции InitilizeComponent.

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

+32
15 дек. '11 в 14:26
источник поделиться
14 ответов

Итак, у меня была такая же проблема в прошлом, для исправления я сделал следующее:

  • Решение → Чистый раствор;
  • Построить → Восстановить решение;
  • Закройте Visual Studio, снова откройте.

Большое спасибо Маршаллу Белю!

+33
02 июл. '13 в 20:56
источник

Связанные вопросы


Похожие вопросы

Я столкнулся с этой ошибкой, потому что мой проект только x64. По-видимому, Visual Studio, являясь 32-битным приложением, не может загружать в конструктор какие-либо формы или элементы управления, скомпилированные до 64 бит. Это имеет общий смысл, но ошибка не дает вам никаких указаний, что является проблемой.

См. ответ в Дизайнер Visual Studio в x64 не работает.

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

+10
06 июл. '16 в 15:41
источник

Возможно, ошибка возникает из-за вашего кода конструктора. Поместите InitializeComponent(); в начало конструктора следующим образом:

public FormularioGeneral()     
{         
    InitializeComponent();
    ConfigurarUI();         
    AccionesConstructor();
    PostInicializacionComponentes();         
    EstablecerIcono();         
    InicializarLocalizacionFormulario();     
} 

Объяснение:

В этом методе инициализируются переменные.

+8
15 дек. '11 в 14:29
источник

В моем случае у меня был более старый проект Windows Forms, в котором InitializeComponents() начинался так:

private void InitializeComponent()
{
    var componentResourceManager = new ComponentResourceManager(typeof(MyForm));
    ...

Это привело к появлению сообщения об ошибке позже при доступе к componentResourceManager внутри InitializeComponent():

Переменная componentResourceManager является необъявленной или никогда не назначалась.

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

Переменная не называлась componentResourceManager а просто resources.

Решение

После переименования моей переменной, чтобы также иметь имена resources, все работает успешно.

Конструктор Windows Forms в Visual Studio 2017 правильно открыл форму.

+6
16 июл. '18 в 9:04
источник

У меня была такая же проблема, и очистка и перестройка не сработали для меня.

В моем случае проблема была вызвана тем, что дизайнер Visual Studio загружал связанные DLL файлы из GAC вместо их загрузки из <HintPath> каталог, указанный в файле .csproj. DLL в GAC не имели той же версии, что и локально хранящиеся библиотеки DLL.

Когда я обновил DLL в GAC, чтобы иметь одну и ту же версию, все снова работало нормально.

+3
04 мар. '15 в 9:18
источник

У меня была эта проблема, когда у моего пользовательского элемента управления был некоторый код в конструкторе, который был связан с ресурсом runtime. Я добавил null check и исправил.

        InitializeComponent();
        if (MyConfig!= null)
        {
            this.label2.Text = MyConfig.text1;
            this.label3.Text = MyConfig.text2;
            this.label1.Text = MyConfig.text3;
        }
+2
27 апр. '17 в 10:35
источник

Пользовательские элементы управления были вызваны проблемой, и после попытки всех предложений, (решение для решения Focus, затем Alt + Enter), изменение решения Platform Target с x64 на любой процессор решило проблему.

+2
01 нояб. '18 в 9:26
источник

Не помещайте ничего, кроме InitializeComponent(); в конструкторе. Вы можете поместить код оттуда в такие события, как Load().

+1
05 авг. '18 в 1:03
источник

Я работаю с WPF внутри Windows Forms.

Я разместил свой пользовательский элемент управления WPF в хосте элемента форм Windows. Из-за этого при вызове InitializeComponent() я выполнил код, прежде чем достигнуть InitializeComponent() моего элемента управления WPF. Tricky.

Итак, я переместил его из своего конструктора, "Чистое построение", "Перестроить", "Перезапустить VS", и все работает так, как ожидалось. Наконец-то.

+1
28 июл. '16 в 10:42
источник

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

Итак, вместо:

protected Color m_VariableName;
public Color VariableName
{
    get { return m_VariableName; }
    set { }
}

делать:

protected Color m_VariableName = Color.White; // Or null
public Color VariableName
{
    get { return m_VariableName; }
    set { }
}

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

+1
15 дек. '11 в 14:33
источник

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

  • Добавьте этот элемент управления в панель инструментов.
  • Очистите решение
  • Восстановить решение

Перерисовать элемент управления, если необходимо.

+1
15 авг. '17 в 16:22
источник

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

public MyForm() //Form constructor
{         
    InitializeComponent();

    //Create/initialize third party control here with new operator    
}
+1
20 февр. '16 в 6:10
источник

Сначала у меня был код, который ссылался на что-то типа, который дизайнер не мог загрузить (по какой-либо причине). Тогда у меня был код в конструкторе, который не мог быть выполнен с моего локального ноутбука. Я решил, что лучшим вариантом было бы переместить логику в событие Load и проверить, был ли компонент в DesignMode, и выйти, если он был.

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

    private void userControl_Load(object sender, EventArgs e)
    {
        if (DesignMode) return;

        Initialize();
    }

    private void Initialize()
    {
        // do your work
    }

Отдельное спасибо за этот SO-ответ, который указал мне на комментарий в сообщении в блоге о том, что вы не можете получить доступ к свойству DesignMode, пока не окажетесь в событии Load...

0
01 мар. '19 в 20:25
источник

Переименование переменной componentResourceManager в ресурсах решило ошибку.

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

0
27 июн. '19 в 16:58
источник

Посмотрите другие вопросы по меткам или Задайте вопрос