Подтвердить что ты не робот

Переменная '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.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Объяснение:

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

Ответ 4

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

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

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

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

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

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

Решение

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

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

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

Ответ 5

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

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

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

Ответ 6

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

        InitializeComponent();
        if (MyConfig!= null)
        {
            this.label2.Text = MyConfig.text1;
            this.label3.Text = MyConfig.text2;
            this.label1.Text = MyConfig.text3;
        }

Ответ 7

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

Ответ 8

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

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

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 { }
}

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

Ответ 9

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

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

    //Create/initialize third party control here with new operator    
}

Ответ 10

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

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

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

Ответ 11

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

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

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

Ответ 12

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

Ответ 13

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

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

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

        Initialize();
    }

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

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

Ответ 14

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

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

Ответ 15

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

Ответ 16

У меня была такая же проблема, и я ее исправил. На самом деле Visual Studio работает только с элементами управления X86, и вы не можете создать пользовательский элемент управления в режиме X64 и использовать его.

Вы должны добавить новую библиотеку классов в режиме Any CPU и построить библиотеку классов. тогда вы можете добавить его DLL в ваш проект. Готово.

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