2011-12-15 4 views
20

У меня есть вопрос, связанный с ошибкой названия. Im работает с C# и Visual Studio 2010.Переменная «variable_name» либо не объявлена, либо никогда не была назначена.

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

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.

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

Спасибо всем! T

+0

убедитесь, что вы вызываете свой конструктор перед использованием кода. public Form1() { FormularioGeneral(); } – Moonlight

+0

Hello Bruno. Ошибка возникает внутри метода InitializeComponent, когда я присваиваю значение m_ * некоторому свойству (например, когда я устанавливаю цвет текста кнопки -> this.Button1.ForeColor = m_TextButtonColor) – Kitinz

+0

также обсуждается здесь: http : //stackoverflow.com/questions/1915183/got-error-the-variable-variable-name-is-either-undeclared-or-was-never-assigne – Christian

ответ

7

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

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

Объяснение:

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

+0

Я уже пробовал, но это не решает проблему. В любом случае переменные объявляются без значения. Значение присваивается внутри метода «ConfigurarUI» (так что этот метод должен быть выполнен перед использованием переменной). Наконец, в InitializeComponent используются переменные. – Kitinz

+0

Насколько я понял вас правильно, изменили ли вы код в «InitializeComponent», чтобы использовать переменные? – Fischermaen

+0

Я не думаю, что назначения были «жестко закодированы» в InitializeComponent, поскольку они автоматически генерируются при каждом компиляции. Я предполагаю, что значения были назначены через Дизайнер, но не могу заверить его, поскольку другой парень начал этот проект и стал «помощником»: P – Kitinz

1

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

Таким образом, вместо того, чтобы:

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

Do:

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

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

+0

Спасибо за ответ. Я пытался сделать так, как вы говорите, инициализируя переменные в объявлении, но не решает проблему: P Я также прочитал о виртуальных методах и скопировал весь код в виртуальном методе внутри конструктора, чтобы не нужно было создавать вызов, но даже в этом случае проблема сохраняется: P – Kitinz

22

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

  • Решение -> Очистить решение;
  • Build-> Rebuild Solution;
  • Закрыть Visual Studio, повторно открыть.

Большое спасибо Marshall Belew!

+1

Я делаю это, и это работает, но мне интересно, почему эта ошибка происходит и как я могу избежать этого. Или это просто ошибка VS? – Pedro77

+1

В случае, если кто-то найдет здесь свой путь, проблема может возникнуть из-за того, что конструктор нарушающего контроля объявляется чем-то другим, кроме 'public'. – Lara

+0

Это 'чистое 'решение, а не' clear'. – Zero

1

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

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

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

1

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

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

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

Это именно моя проблема, я создал некоторый UserControl, и по какой-то причине процесс генерации Design of the Form всегда жалуется. После того, как я переместил что-то подозрительное из InitializeComponent, оно работает нормально. Спасибо –

5

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

См. the answer - Visual studio designer in x64 doesn't work.

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

+0

Слишком плохо даже в визуальной студии 2017 они все еще не говорят правду ... 2 часа в Интернете, после попытки вручную изменить GUI ... все это, пока я не пришел сюда ... – ephraim

1

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

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

Поэтому я переместил его из своего конструктора, очистил сборку, перестроил, перезагрузил VS, и все работает так, как ожидалось. В заключение.

1

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

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

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

  1. Добавить этот элемент управления в панель инструментов.
  2. Чистый раствор
  3. Перестроить решение

перерисовки контроль, если необходимому.