web-dev-qa-db-fra.com

La variable 'nom_variable' n'est pas déclarée ou n'a jamais été affectée

J'ai une question liée à l'erreur sur le titre. Je travaille avec c # et Visual Studio 2010.

J'ai un formulaire déclaré comme "classe publique FormularioGeneral: Form", qui est la base pour le reste des formulaires dans ma demande. Lorsque j'essaie d'accéder à la vue Designer, j'obtiens plusieurs fois cette erreur, comme vous pouvez le voir sur l'image:

Sample of errors Toutes les erreurs font référence à des lignes à l'intérieur de la méthode InitializeComponent, où la valeur est affectée à une propriété comme celle-ci:

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

Mais toutes les variables sont déclarées dans la même classe que les propriétés en lecture seule et toutes sont affectées à l'intérieur d'une méthode qui est appelée dans le constructeur.

Déclaration des propriétés:

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

Code constructeur:

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

Méthode 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)));
        [...]
}

Donc, pour autant que je sache, toutes les variables qui donnent les erreurs sont correctement déclarées et ont une valeur assignée avant l'appel de la fonction InitilizeComponent.

Je suis coincé à ce stade et je ne sais pas quoi faire pour résoudre le problème. J'espère que certains d'entre vous pourront m'aider à résoudre ce problème.

33
Kitinz

Donc, j'ai eu le même problème dans le passé, pour corriger j'ai fait ce qui suit:

  • Solution → Solution propre;
  • Build → Reconstruire la solution;
  • Fermez Visual Studio, rouvrez.

Merci beaucoup à Marshall Belew!

36
Lucas

J'ai rencontré cette erreur car mon projet est uniquement x64. Apparemment, Visual Studio, étant une application 32 bits, ne peut pas charger de formulaires ou de contrôles compilés en 64 bits dans le concepteur. Cela a un sens total, mais l'erreur ne vous donne aucune indication que c'est le problème.

Voir la réponse à le concepteur de Visual Studio en x64 ne fonctionne pas .

La solution de contournement consiste à changer votre projet en N'importe quel CPU lors de la conception, puis à revenir lors de la construction.

10
Swoogan

Peut-être que l'erreur se produit en raison de votre code constructeur. Placez InitializeComponent(); au début du constructeur comme ceci:

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

Explication:

Les variables sont initialisées dans cette méthode.

8
Fischermaen

Dans mon cas, j'avais un ancien projet Windows Forms où InitializeComponents() avait commencé comme ceci:

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

Cela a généré un message d'erreur plus tard lors de l'accès à componentResourceManager à l'intérieur de InitializeComponent():

La variable "componentResourceManager" n'est pas déclarée ou n'a jamais été affectée.

En comparant avec un formulaire nouvellement créé, j'ai vu qu'il était similaire à mon formulaire non fonctionnel, sauf pour une chose:

La variable n'était pas nommée componentResourceManager mais simplement resources.

Solution

Après avoir renommé ma variable pour avoir également le nom resources, tout fonctionne correctement.

Le Concepteur Windows Forms dans Visual Studio 2017 a correctement ouvert le formulaire.

6
Uwe Keim

J'ai eu le même problème et le nettoyage et la reconstruction n'ont pas fonctionné pour moi.

Dans mon cas, le problème était dû au fait que le concepteur Visual Studio chargeait des DLL référencées à partir du GAC au lieu de les charger à partir du répertoire <HintPath> spécifié dans le fichier .csproj. Les DLL du GAC n'avaient pas la même version que les DLL stockées localement.

Lorsque j'ai mis à jour les DLL dans le GAC pour avoir la même version, tout fonctionnait à nouveau correctement.

3
frodesto

J'ai eu ce problème lorsque mon contrôle utilisateur avait du code dans le constructeur qui était lié à la ressource d'exécution. J'ai ajouté une vérification nulle et cela a été corrigé.

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

Les contrôles utilisateur ont causé un problème et après avoir essayé toutes les suggestions, ( Focus solution puis Alt + Enter ) modification de la solution Platform Target from - x64 to Any CP a résolu le problème.

2
Furkan Ekinci

Je travaille avec WPF dans Windows Forms.

J'ai hébergé mon contrôle utilisateur WPF dans un hôte d'élément Windows Forms. Pour cette raison, lorsque InitializeComponent () a été appelé, j'ai exécuté du code avant d'atteindre le InitializeComponent () de mon contrôle WPF. Rusé.

Je l'ai donc retiré de mon constructeur, Clean Build, Rebuild, Restart VS et tout fonctionne comme prévu. Finalement.

1
Matthis Kohli

Dans mon cas, j'ai ajouté un contrôle tiers dans ma barre d'outils (via un fichier .dll) et en dessine un dans mon formulaire. Et pour une raison quelconque, ma barre d'outils nettoie ce contrôle tiers hors du groupe général (je l'ai ajouté dans le groupe général), donc VS ne peut pas trouver ce contrôle. Voici ce que j'ai fait pour résoudre ce problème:

  1. Ajoutez ce contrôle dans la barre d'outils.
  2. Nettoyez la solution
  3. Reconstruisez la solution

Redessinez le contrôle si nécessaire.

1
Mathew Li

Cette erreur se produit pour moi lors de la création d'un contrôle tiers dans InitializeComponent () qui est appelé à partir du constructeur de formulaire. Lorsque je l'ai créé après InitializeComponent (), cela fonctionne bien pour moi.

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

    //Create/initialize third party control here with new operator    
}
1
Pabitra Dash

Ne mettez rien d'autre que InitializeComponent(); dans le constructeur. Vous pouvez mettre le code à partir de là dans des événements comme Load().

1
user2638817

Concernant les variables, pouvez-vous simplement les initialiser dans la déclaration? Je pense que cela suffirait, même si vous modifiez la valeur plus tard. D'après ce que je vois, le compilateur est incapable de vérifier si vous les avez initialisés ou non car ce n'est pas directement sur le code constructeur, cela se fait sur une méthode virtuelle qui n'évaluera qu'à runtime.

Donc, au lieu de:

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

Faire:

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

Et un commentaire: vous devez éviter les appels virtuels dans le constructeur, ce qui peut conduire à des erreurs obscures dans votre application. Vérifiez-le ici .

1
Bruno Brant

Renommer la variable componentResourceManager en erreur résolue de ressources.

Malheureusement, j'ai dû changer une tonne d'autres éléments pour que le concepteur travaille pour le concepteur de rapports Telerik

0
user2956084

Dans ma solution, j'avais des chemins de référence incorrects que j'ai corrigés dans les fichiers .csproj. Après avoir corrigé cela, je pouvais enfin charger à nouveau le formulaire.

0
drecunion

J'ai d'abord eu du code qui faisait référence à quelque chose d'un type que le concepteur ne pouvait pas charger (pour une raison quelconque). Ensuite, j'avais du code dans le constructeur qui ne pouvait pas être exécuté à partir de mon ordinateur portable local. J'ai décidé que la meilleure option était de déplacer la logique vers l'événement Load et de vérifier si le composant était en DesignMode et de quitter s'il l'était.

Même cela ne me suffisait pas car le concepteur essayait toujours de JIT le type qui était plus tard dans la méthode, j'ai donc dû le déplacer vers une méthode distincte pour empêcher cela de se produire. Voici essentiellement ce que j'ai fini avec:

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

        Initialize();
    }

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

Un merci spécial à this SO answer qui m'a renvoyé à un commentaire dans un article de blog sur l'accès à la propriété DesignMode jusqu'à ce que vous soyez dans l'événement Load ...

0
csrowell