2009-06-11 9 views
2

J'ai créé un contrôle personnalisé inclus dans une bibliothèque de contrôles référencée par une application VB Forms.Pourquoi mon formulaire plante-t-il lorsque je change mon contrôle personnalisé?

Lorsque je modifie le contrôle et que l'application s'ouvre dans une fenêtre VS, VS me demande généralement si je souhaite recharger les éléments qui ont été modifiés.

Cependant, à quelques reprises, il ne m'a pas demandé cela, et quand je vais ouvrir le formulaire qui contient le contrôle modifié, je reçois une fenêtre d'erreur m'avertissant que si j'ignore le message d'erreur et continuer, alors Je risque de rendre VS instable. J'ai appris à ignorer ce message d'erreur, à continuer et à enregistrer immédiatement le formulaire dans un nouveau fichier.

Est-ce que quelqu'un d'autre a eu ce problème? Est-ce un bug dans VS?

+0

Pouvez-vous nous donner le message d'erreur réel et un peu plus d'informations sur votre configuration? Comme avez-vous 1 ou 2 instances de VS ouvertes? – JaredPar

+0

Désolé, je ne me souviens pas du message d'erreur réel - il a essentiellement dit que quelque chose ne va pas, si je continue alors le concepteur pourrait devenir instable. Il avait un lien vers le code derrière lequel est le code généré pour l'initialisation des composants qui est généré. J'utilise 2 fenêtres VS - une pour éditer la ControlLibrary, et une pour le client (eh bien ... en fait j'ai 4 - 2 autres projets ouverts aussi :) –

Répondre

0

Le problème semblait être des références à des contrôles qui n'existent plus, parfois parce que le fichier .dll htat dans lequel le contrôle se trouve n'est plus disponible. J'ai découvert ceci en effectuant un "Tout Nettoyer" sur ma bibliothèque de contrôle, puis en obtenant l'erreur quand j'ai ouvert un formulaire en référençant le contrôle - le problème quand loin quand je "Reconstruisais tout" dans la bibliothèque de contrôle.

0

Il est plus probable qu'un bug dans votre contrôle. Le concepteur de formulaire VS va créer une instance de votre contrôle dans le concepteur, donc si votre contrôle fait quelque chose comme atteindre une base de données, il va lancer une exception et empêcher le rendu du formulaire.

Il est en fait tout à fait possible d'attacher un débogueur d'une autre instance de Visual Studio et de mettre des points d'arrêt sur des lignes de code dans votre contrôle utilisateur - à partir de là, vous pouvez affiner les lignes de code.

Une fois que vous trouvez la ligne qui est à l'origine du problème, l'envelopper avec ceci:

If Me.DesignMode Then 
    Return 
End If 

La DesignMode propriété renvoie True lorsque le contrôle est rendu dans le concepteur, sinon false. Cette propriété n'est pas fiable à 100%. Si vous avez un contrôle dans un autre contrôle, la propriété DesignMode du contrôle enfant sera False. Douleur douloureuse douloureuse à travailler lorsque vous avez plusieurs couches de contrôles imbriqués.

2

Vous êtes probablement en train de sérialiser des propriétés auxquelles vous n'avez pas l'intention de procéder et de provoquer des modifications inattendues. Regardez le code du concepteur et voyez ce que le concepteur crée pour votre contrôle.

Vous pouvez ajouter l'attribut suivant aux propriétés pour éviter sérialisation:

Imports System.ComponentModel

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _ 
0

Le problème est pas avec le contrôle lui-même - après avoir quitté VS, et la charge arrière du projet dans (avec la nouvelle copie d'urgence du formulaire qui a été saccagé) cela fonctionne bien. Donc, je ne pense pas qu'il y ait de problème avec le code écrit, puisque tout fonctionne correctement tant que l'application n'est pas ouverte en modifiant le contrôle (qui se trouve dans une autre bibliothèque).

La raison peut-elle être liée à des modifications non enregistrées dans le formulaire et à la modification créée en modifiant le formulaire?

+0

Regardez le code généré par le concepteur (pour la poubelle forme) comme je l'ai dit plus haut, il y a une sérialisation qui ne devrait pas l'être. – eschneider

+0

Merci, cela semble avoir été la cause du problème. –

+0

Pas de problème, désolé je ne pouvais pas l'expliquer mieux, mais c'est un problème. – eschneider

0

J'ai aussi eu ce problème. La meilleure façon de l'éviter est de créer une nouvelle version de votre contrôle, par ex. SimpleKeyboard3, assurez-vous de supprimer l'ancien de votre formulaire, puis remplacez-le par le nouveau. Sinon, le formulaire pourrait faire référence à des propriétés ou à d'autres éléments qui ne peuvent plus être référencés.

Ou, vous pouvez supprimer le contrôle de votre formulaire, puis modifier le contrôle, puis l'ajouter à votre barre d'outils, puis le faire glisser dans votre formulaire.

Même s'il est saccagé, vous pouvez toujours le réparer en choisissant l'option "Ignorer et continuer .. cela peut rendre le concepteur instable" afin de pouvoir supprimer le contrôle.

Questions connexes