2009-12-16 22 views
6

Implemento una gran forma en winforms C# con Visual Studio 2008. después de trabajar bien para una gran parte del cuadro de diálogo muestra muchos errores de masseges como en el título cuando trato de abrir el diseñador.tiene error La variable <nombre de variable> no está declarada o nunca fue asignada

"La variable es o no declarados o nunca fue asignado"

Tengo esto para una gran cantidad de controles que funcionaba muy bien antes. Creo que sucede con el control personalizado que uso

+1

Muéstranos el código y señala la línea en la que aparece el mensaje de error. –

+0

Copie todo el error de texto del descriptor y péguelo aquí;) – serhio

Respuesta

0

Compruebe su archivo designer.cs. Puede faltar declaraciones de control.

¿Su código se compila y ejecuta?

+0

sí ... solo el autor no especifica el idioma usado :) – serhio

+0

Él dice C# - "Implemento una gran forma en winforms C#" – Rezler

+0

gracias por la respuesta . sí el código compilar y ejecutar. ¿cómo reviso el designer.cs? ¿Qué declaraciones de control se deben hacer? Tal – tal

6

primera recomendación es no usar cualquier lógica complicada en forma constructor, pero en caso carga del formulario (o anula el método de proceso de carga).

El diseñador utiliza el código de constructor para mostrar el formulario, y si tiene errores, su formulario será "no reproducible" en el diseñador de VS.

En segundo lugar, cada vez que tenga problemas en el diseñador, ciérrelo y reconstruya el proyecto de su formulario. Verifique los errores y advertencias en la ventana de lista de errores. Después de solucionarlo, vuelva a abrir su formulario en modo desig.

+0

solo tengo InitializeComponents en el constructor – tal

+0

ver mis últimas ediciones en la respuesta. – serhio

+0

Tuve la misma advertencia: "la variable no está declarada o nunca fue asignada" para una variable declarada y asignada en un Servicio de Windows VS 2010 que se dirige a .NET 4 y hace esto "cada vez que tiene problemas en el diseñador, ciérrelo y reconstruya" el proyecto de tu formulario ". se hizo cargo del problema por mí. Gracias serio. –

4

encontré una solución de trabajo:

El problema inicial ocurrió cuando mis controles personalizados y el diálogo se encontraban en la misma DLL/proyecto/montaje.

Creé una DLL de control de Windows separada para todo el control personalizado y ... el diseñador mostró el cuadro de diálogo.

3

Creo que he visto el mismo problema y creo que es un error en VS. De vez en cuando (no estoy seguro de las circunstancias exactas), incluso la creación de una forma completamente nueva y vacía y la adición de un único control personalizado hará que el diseñador explote en la forma que usted describe. Copiando y pegando el código para el control personalizado en un nuevo proyecto vacío y agregándolo a un nuevo formulario, el problema no aparece.

El diseñador simplemente no genera la línea cerca de la parte superior de InitializeComponent():

this.customControl1 = new Controls.CustomControl(); 

De hecho, si inserto manualmente la línea por encima de ella se quita cuando se vuelve a generar el proyecto.

Mirando hacia atrás en mis proyectos anteriores, puedo ver que el error estaba presente en VS2005 y todavía lo tengo hoy en VS2010. Mi código anterior está salpicada de bits de la siguiente manera:

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

Huelga decir que el diseñador trabaja la mayor parte del tiempo. No he encontrado ninguna forma de reproducir el problema de forma consistente, pero curiosamente quitando un formulario de la solución y recreando uno con el mismo nombre + control personalizado, el problema sigue ahí.

2

Este error también ocurrió para uno de nuestros formularios y tuvimos un momento realmente difícil para diagnosticar lo que lo estaba causando.El código del formulario en realidad estaba en 3x archivos .cs. La base form.cs, el designer.cs y el formulario se extendieron (se declaró como una clase parcial).

Así 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 
    } 
} 

Lo que el problema era para este caso fue las declaraciones de variables para variables en el diseñador InitializeComponent debe aparecer en el archivo .designer.cs y no en ninguno de los otros archivos de origen. Entonces, cuando dijo que la variable no declarada significaba que no estaba declarada en el alcance que el diseñador estaba buscando.

Parece que alguien decidió mover las declaraciones de variables a uno de los otros archivos de clase parcial y no se dio cuenta de que se rompe el diseñador.

+0

Nota: en mi caso, la llamada al nuevo método de un control personalizado no estaba en el método InitilaizeComponent en el archivo designer.cs. – Jeff

1

Como han dicho otros, no debería haber ninguna lógica complicada en el constructor del control de usuario.

En teoría, el lugar para realizar inicializaciones complicadas debe ser el controlador de eventos Load o OnLoad(). Sin embargo, en VS2010, usar el evento Load del control (o OnLoad()) no es suficiente.

Si el control de usuario está residiendo en el mismo conjunto que la forma que lo está utilizando, y que desea ver el formulario en el diseñador, VS2010 no sólo ejecutar el constructor del control de usuario, sino también su onLoad() o Evento de carga Esto no parece suceder siempre, pero cuando el Diseñador necesita reconstruir el formulario.

Así que si tiene alguna lógica complicada allí o utiliza recursos externos, como una base de datos, puede arrojar este error al abrir el Diseñador para el formulario adjunto. Esto es malo porque usar el evento Load debería ser el lugar correcto para hacerlo.

Es posible que tenga que usar la inicialización diferida para cualquier recurso vital que tenga que inicializar antes de ejecutar el formulario.

ej .:

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

Es un error en el IDE. No importa cómo lo mires, hay una manera indeterminada en la que el constructor instanciará tus campos y los usará como estáticos más adelante en el constructor.

Por ejemplo:

private ComponentResourceManger resources = null; 

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

Will generalmente romper su diseñador. A veces funciona, pero normalmente se confunde ... puede cambiar el nombre de todos los recursos incrustados o incluso eliminarlos. Tiene sentido tener una copia de una imagen en su archivo .resx, pero al diseñador le gusta ver una para cada control. Incluso si fue compartido ... le gusta hacer una copia.

Los errores típicos incluyen, "No se puede encontrar 'MainForm'" y más tarde hacia abajo ... obtener un NPE para los recursos.GetObject ("MyImage"); Incluso si los .resx lo tiene con el exacto nombre de archivo especificado.

Generalmente, siempre se garantiza que la solución funcionará si se crea el obj dentro de la rutina InitializeComponent().

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

¿Cómo va a hacer referencia a esto externamente depende de usted.

0

En mi caso depende de la plataforma para la que construyo el proyecto. Para x86 todo estaba bien, pero para x64 recibí este error. Entonces, mi solución fue desarrollar el proyecto en Debug/x86 y luego construirlo para todas las plataformas de destino requeridas.

Cuestiones relacionadas