2009-12-16 15 views
6

implemento una grande forma in WinForms C# con Visual Studio 2008. dopo aver lavorato bene per una grande parte della finestra di dialogo si avvia mostrando un sacco di masseges errore come nel titolo quando cerco di aprire il designer.ha ricevuto l'errore Il <nome variabile> variabile è o non dichiarata o non è mai stato assegnato

"La variabile è o non dichiarata o non è mai stato assegnato"

ho ottenuto questo per un sacco di controlli che ha funzionato benissimo prima. Penso che succede con il controllo personalizzato che io uso

+1

Mostraci il codice e indica la linea in cui appare il messaggio di errore. –

+0

Copia tutto l'errore di testo dal desiner e incollalo qui;) – serhio

risposta

0

Controlla il tuo file designer.cs. Potrebbe mancare dichiarazioni di controllo.

Il codice viene creato ed eseguito?

+0

sì ... solo l'autore non specifica la lingua utilizzata :) – serhio

+0

Egli dice C# - "Io implemento un grande modulo in winforms C#" – Rezler

+0

grazie per la risposta . sì, il codice viene compilato ed eseguito. come posso controllare il designer.cs? quali dichiarazioni di controllo dovrebbero essere fatte? Tal – tal

6

prima raccomandazione è NON utilizzare qualsiasi logica complicata in forma costruttore, ma nell'evento Load del modulo (o sostituzioni del metodo OnLoad).

Il progettista utilizza il codice del costruttore per visualizzare il modulo e in caso di errori il modulo sarà "non visualizzabile" nel designer VS.

In secondo luogo, ogni volta che si verificano problemi nel designer, chiuderlo e ricostruire il progetto del modulo. Verificare gli errori e gli avvisi nella finestra dell'elenco degli errori. Dopo averlo risolto, riapri il modulo in modalità Desig.

+0

ho solo InitializeComponents nel costruttore – tal

+0

vedere le mie ultime modifiche nella risposta. – serhio

+0

Avevo lo stesso avviso "la variabile è non dichiarata o non è mai stata assegnata" per una variabile dichiarata e assegnata in un servizio Windows 2010 VS. NET 4, e facendo questo "ogni volta che si verificano problemi nella finestra di progettazione, chiuderla e ricostruire il tuo progetto di forma. " mi sono preso cura del problema per me. Grazie serhio. –

4

ho trovato una soluzione di lavoro:

Il problema iniziale è accaduto quando i miei controlli personalizzati e la finestra erano nella stessa DLL/progetto/montaggio.

Ho creato una DLL di controllo Windows separata per tutto il controllo personalizzato e ... il progettista ha mostrato la finestra di dialogo.

3

Credo di aver visto lo stesso problema e penso che sia un bug in VS. Di tanto in tanto (non sono sicuro delle circostanze esatte), anche la creazione di una forma completamente nuova e vuota e l'aggiunta di un singolo controllo personalizzato farà esplodere il progettista nel modo in cui descrivi. Copiando e incollando il codice per il controllo personalizzato in un nuovo progetto vuoto e aggiungendolo a un nuovo modulo, il problema non viene visualizzato.

Il progettista semplicemente non genera linea vicino all'inizio della InitializeComponent():

this.customControl1 = new Controls.CustomControl(); 

Infatti, se inserisco manualmente la riga precedente viene rimosso quando il progetto viene ricostruito.

Guardando indietro ai miei progetti precedenti, posso vedere il bug era presente in VS2005 e lo trovo ancora oggi in VS2010. Il mio codice precedente è disseminata di bit in questo modo:

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

Inutile dire, il progettista lavora la maggior parte del tempo. Non ho trovato alcun modo di riprodurre il problema in modo coerente, ma rimuovendo in modo interessante un modulo dalla soluzione e ricreandone uno con lo stesso nome + controllo personalizzato, il problema è ancora lì.

2

Questo errore si è verificato anche per una delle nostre forme e abbiamo avuto un momento davvero difficile per diagnosticare ciò che stava causando.Il codice del modulo era in realtà in 3 file .cs. La base form.cs, la designer.cs e il modulo sono stati estesi (è stato dichiarato come una classe parziale).

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

Quello che il problema è stato per questo caso è stato le dichiarazioni variabili per le variabili nel designer InitializeComponent deve essere presente nel file .designer.cs e non negli altri file di origine. Quindi quando ha detto che la variabile è non dichiarata significava che non era dichiarata nel campo di applicazione che il progettista stava cercando.

Sembra che qualcuno ha deciso di spostare dichiarazioni di variabili in uno degli altri file di classe parziale e non si rendeva conto che rompe il progettista.

+0

Nota: nel mio caso la chiamata al metodo New di un controllo personalizzato non era nel metodo InitilaizeComponent nel file designer.cs. – Jeff

1

Come altri hanno già detto, non si dovrebbe avere alcuna logica complicata nel costruttore del controllo utente.

In teoria, il posto giusto per fare qualsiasi Inizializzazioni complicate dovrebbe essere il gestore di eventi Load o OnLoad(). Tuttavia, in VS2010, l'utilizzo dell'evento Load del controllo (o OnLoad()) non è sufficiente.

Se UserControl risiede nello stesso assieme del modulo che lo sta utilizzando e si desidera visualizzare il modulo in Designer, VS2010 non esegue solo il costruttore di UserControl, ma anche il suo OnLoad() o Carica evento. Questo non sembra accadere sempre, ma quando il Designer ha bisogno di ricostruire il modulo.

Quindi, se avete qualsiasi logica complicata lì o utilizzare risorse esterne, come un database, può gettare questo errore quando si apre la finestra di progettazione per la forma che racchiude. Questo è male perché usare l'evento Load dovrebbe essere il posto giusto per farlo.

Potrebbe essere necessario utilizzare l'inizializzazione pigra per qualsiasi risorsa vitale che si deve inizializzare prima di eseguire il modulo.

Es .:

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

Si tratta di un bug nel IDE. Indipendentemente dal modo in cui lo guardi, c'è un modo indeterminato nel quale il costruttore istanzia i tuoi campi e li fa usare come statici più avanti nel costruttore.

Ad esempio:

private ComponentResourceManger resources = null; 

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

Will solito rompere il vostro progettista. A volte funziona, ma normalmente si confonde .. può rinominare tutte le risorse incorporate o persino rimuoverle. Ha senso avere una copia di un'immagine nel tuo file .resx, ma al progettista piace vederne una per ogni controllo. Anche se è stato condiviso ... gli piace fare una copia.

Gli errori tipici includono, "Impossibile trovare 'MainForm'" e successivamente verso il basso .. ottenere un po 'di NPE per resources.GetObject ("MyImage"); Anche se il .resx lo ha con il esatto nomefile specificato.

In genere, la soluzione è sempre garantita se si installa l'oggetto nella routine InitializeComponent().

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

Come farete riferimento esternamente dipende da voi.

0

Nel mio caso dipende dalla piattaforma per la quale costruisco il progetto. Per x86 era tutto a posto, ma per x64 ho ricevuto questo errore. Quindi, la mia soluzione era sviluppare il progetto sotto Debug/x86 e poi costruirlo per tutte le piattaforme di destinazione richieste.

Problemi correlati