web-dev-qa-db-fra.com

Visual studio affiche des messages sans fin "La génération de code pour la propriété 'valueMember' a échoué."

Après plusieurs jours de piratage heureux de cette application C # à l'aide de Visual Studio 2008, je suis frappé par un barrage de boîtes de dialogue d'erreur montrant:

La génération de code pour la propriété 'valueMember' a échoué.
L'erreur était: 'La référence d'objet n'est pas définie sur une instance d'un objet.'

Cela se produit maintenant souvent lorsque je fais un petit changement dans le concepteur, par exemple décaler un contrôle de quelques pixels, puis essayez d'enregistrer. Plusieurs de ces boîtes de dialogue d'erreur apparaissent chaque seconde, me gardant occupé à annuler toutes celles-ci en appuyant sur la touche Entrée tout en essayant d'obtenir alt-F4 pour que VS se ferme.

Finalement, je ferme VS et enregistre les modifications que j'ai apportées. Après avoir redémarré VS, je fais "nettoyer" sur l'ensemble du projet, puis "build" et tout fonctionne bien, l'application fonctionne bien, aucun problème.

Jusqu'à ce que je fasse un autre léger changement dans le concepteur de formulaires.

Je ne connais aucune propriété valueMember dans mon application.

Cela me rend fou, c'est un vrai showstopper pour mon projet. Toute aide est appréciée.

22
Roland

Comme cela se produit au moment de la conception, il est probable que vous ayez un contrôle personnalisé qui nécessite un paramètre ou une autre valeur qui n'a pas de valeur par défaut.

En mode Création dans Visual Studio; une instance de contrôle est créée pour la restituer sur l'éditeur visuel, mais si le contrôle nécessite qu'une propriété soit définie avant de pouvoir être rendue, cela entraînera une erreur.

Pouvez-vous vérifier que tous les contrôles personnalisés ont des valeurs par défaut, et tout ce qui est référencé dans le constructeur qui ne peut pas avoir de valeur par défaut est encapsulé par la propriété DesignMode - voir http://msdn.Microsoft.com/en- us/library/system.componentmodel.component.designmode.aspx .

12
Kami

Essayez de fermer et de rouvrir Visual Studio. cela peut sembler idiot, mais ça marche !!

16
Chani Poz

Vous pouvez déboguer le concepteur à l'aide d'un autre studio visuel et l'attacher au processus. Si vous avez une exception, il devrait être facile de la trouver de cette façon. En général, lors de l'ouverture du concepteur, le constructeur et bien sûr initializeComponent sont en cours d'exécution.

15
shanif

Similaire à la réponse de @ Chanipoz (fermer/rouvrir), mon application de formulaires riche en composants/contrôles utilisateur partout a commencé à se compiler avec bonheur après avoir fermé la fenêtre principale du concepteur de formulaires.

J'ai cette pile de code depuis des années et je n'ai jamais vu l'erreur jusqu'à aujourd'hui. Je ne sais pas d'où ça vient. Mais quelque chose aujourd'hui à propos de l'ouverture du formulaire dans le concepteur a rendu tout malheureux. Il suffit de le fermer de l'écran pour que tout se passe bien.

2
bkwdesign

Utilisez une autre instance de Visual Studio pour attacher à la première instance de Visual Studio.

Allez dans Debug-> Attach To Process et recherchez le processus devenv.exe. Comme vous aurez deux processus devenv.exe en cours d'exécution, vous voudrez probablement choisir celui avec l'ID inférieur, c'est généralement la première instance de Visual Studio qui a été exécutée.

1
Garrett Banuk

Le problème est le code d'initialisation manquant pour une propriété publique sur le contrôle. Cela sera ajouté pour vous lorsque vous ajouterez le contrôle au concepteur, mais si vous remplacez un contrôle par un contrôle dérivé ou mettez à jour le composant, le concepteur ne sait pas comment gérer cela.

Si vous avez un contrôle (wincontrol) avec une propriété publique PropertyA et que vous l'ajoutez à un formulaire (myForm), le concepteur ajoutera toutes les initialisations nécessaires aux propriétés dans myForm.Designer.cs. Quelque chose comme;

Wincontrol1.PropertyA = new List<widget>();

Il n'est pas rare d'avoir besoin de modifier légèrement un contrôle, disons que nous avons un nouveau contrôle MyWinControl

public partial class MyWinControl : WinControl
{
    public List<wodget> PropertyDer1;
    protected List<wodget> PropertyDer2;
}

Si vous sous ce nouveau contrôle pour l'ancien contrôle dans myForm.Designer.cs, vous pouvez très bien rencontrer ce problème. La raison en est que PropertyDer1 n'a aucune initialisation dans le concepteur winforms. PropertyDer2 ne causera aucun problème car il est protégé. De même, si vous aviez un composant personnalisé et que vous ajoutez une nouvelle propriété publique après que le composant a été ajouté à une fiche.

Si toutefois vous supprimez l'instance de WinControl sur le formulaire et faites glisser une instance de MyWinControl sur le formulaire à la place, l'initialisation appropriée se produira et vous ne verrez pas l'erreur. Le concepteur aura créé le nouveau contrôle comme celui-ci

Wincontrol1.PropertyA = new List<widget>();
Wincontrol1.PropertyDer1= new List<wodget>();

Il existe deux solutions faciles qui ne nécessitent pas de cacher la propriété au concepteur. 1. Si la propriété n'a pas besoin d'être publique, donnez-lui le bon modificateur 2. Si la propriété doit être publique, modifiez simplement le code dans myForm.Designer.cs comme dans le code ci-dessus pour ajouter le manquant initialiseur

0
statler

J'ai dû faire face à ce problème. Comme je n'ai pas trouvé la solution (beaucoup d'héritage), je peux dire: .SuspendLayout() et .ResumeLayout() peut être manquant dans le code ou l'un d'eux. Il en va de même pour .BeginInit() et .EndInit(). Il est prévu entre eux, qu'il y aura = new ... et certains paramètres des propriétés. Peut-être que quelqu'un confronté à ce problème trouverait la solution avec ces informations.

0
pbies