2017-03-14 2 views
0

J'ai un problème avec mon programme que j'ai réussi à affiner dans un exemple de code.C# reconstruction fait tourner une partie de mon programme (chargement d'un contrôle utilisateur), et en cliquant sur play peut provoquer une reconstruction et l'exécuter deux fois

Ajouté Remarque - http://ge.tt/7paP1Gj2 < --- un lien vers mon fichier zip de 70 Ko de code.

C# rebuilding fait partie de mon programme (en chargeant un contrôle utilisateur), et cliquer sur play peut provoquer une reconstruction et l'exécuter deux fois. Double-cliquer sur le formulaire peut également le désactiver parfois. Je vais élaborer sur ce que je veux dire par là.

Mon programme a été créé de la manière suivante.

je clique droit sur le projet puis cliquez sur ajouter ... User Control

J'ai la forme et le contrôle de l'utilisateur.

J'ai le code suivant sous forme de charge et le code suivant dans le contrôle de l'utilisateur

private void Form1_Load(object sender, EventArgs e) 
    { 
     // any time i change this e.g. change the string e.g. change "loaded" to "loaddddd" and click Form1 in solution explorer. then the "uc loaded" messagebox comes up 
     MessageBox.Show("form loadeddd"); 

    } 

Et ce qui suit dans le contrôle utilisateur

private void UserControl1_Load(object sender, EventArgs e) 
    { 
     MessageBox.Show("uc loaded"); 

     // any time i change this string then rebuild, then the "uc loaded" message box comes up. 
     string a="abc"; 

    } 

Alors maintenant je clique sur le jeu. "uc loaded" apparaît deux fois, et "form loaded" apparaît une fois.

Si je clique à nouveau sur lecture, (ne changeant aucun code), alors "uc loaded" apparaît une fois, "form loaded" apparaît une fois.

Si je double-clique sur Form1 dans l'explorateur de solutions, aucun comportement étrange ne se produit. Le formulaire apparaît juste. Aucune boîte de message n'est déclenchée.

Maintenant, disons que je change la chaîne de boîte de message "chargée de formulaire" par ex. "form loaded" à "form loadedd" Ensuite, je double-clique sur Form1 dans l'explorateur de solutions, et une boîte de message apparaît indiquant "uc loaded". Cela me semble étrange. Si je clique à nouveau sur Form1, "uc loaded" n'apparaît pas. Si je change à nouveau la chaîne et dbl cliquez sur Form1, la boîte de message "uc loaded" apparaît. Si je clique à nouveau sur Form1, il n'apparaît pas.

Maintenant, disons que je clique sur Lecture. Ensuite, je reçois "uc chargé" apparaissent deux fois. Comme si c'était peut-être d'abord une reconstruction (ce qui semble irrémédiablement exécuter la méthode de chargement du contrôle de l'utilisateur), (comme si cela avait été fait), puis l'exécution du programme. Si je clique à nouveau sur Play, "uc loaded" apparaît une seule fois. Si je change cette chaîne «formulaire chargé», alors je clique sur Lecture, puis «uc chargé» apparaît deux fois. Cliquez à nouveau sur lecture et il apparaît une fois. Si je change la chaîne "form loaded" ou la chaîne "uc loaded" ou l'autre chaîne, alors "uc loaded" apparaît deux fois, quand je clique sur play. Mon code a commencé avec plus de contenu et j'ai dupliqué le dossier et coupé et dupliqué le dossier et le couper, avant de le rendre aussi petit qu'il est tout en produisant encore le comportement. Mais dans le cas où le comportement n'est pas facilement reproductible .. j'ai inclus un lien vers mon code d'exemple coupé qui quand je l'essaye maintenant montre l'erreur et très proprement.

+0

1. Ne pas reproduire la capacité 2. MessageBox affiche lors de la reconstruction? Vous n'exécutez même pas le programme ... – EpicKip

+0

Au moment de la conception, les contrôles utilisateur peuvent être instanciés et le code commence à s'exécuter de façon inattendue - je ne sais pas si c'est lié à cela, mais voyez ce lien: http://stackoverflow.com/ questions/282014/net-windows-formes-design-time-rules – PaulF

+0

@EpicKip que voulez-vous dire que ce n'est pas reproductible. Avez-vous même essayé de le reproduire? J'ai parlé de reconstruire (ce qui ne devrait pas vraiment le faire fonctionner), mais j'ai aussi parlé de cliquer sur Play (qui évidemment le lance), donc je ne sais pas de quoi vous parlez quand vous dites que je ne suis même pas en train de programme. – barlop

Répondre

1

Cela est dû au fait que vous avez placé votre UserControl directement sur votre formulaire.

Il y a 2 solutions à ce problème:

Ajoutez le contrôle sur l'exécution:
Vous pouvez utiliser un panneau comme un « espace réservé » pour un contrôle utilisateur, vous pouvez l'ajouter à l'exécution comme ceci:

NameOfUserControl userControl = new NameOfUserControl(); 
nameOfPanel.Controls.Add(userControl); 

vérifier le mode de conception:
dans votre fonction de la charge de contrôle de l'utilisateur, vous pouvez vérifier si son en mode conception ou en cours d'exécution.

if(Application.ExecutablePath.IndexOf("devenv.exe", StringComparison.OrdinalIgnoreCase) == -1)  
{  
    //Not in designer mode use > to check for designer mode 
    MessageBox.Show("uc loaded");  
} 
+0

réponse acceptée parce que la solution de contournement fonctionne .. ou test si le chemin est devenv et si c'est alors le retour (mais peut-être faut-il faire attention en expérimentant avec des variations de ça une fois j'ai fait une Application.Exit à condition mode de conception, et le programme n'a pas ouvert, mais un goto ou sans doute un «retour», ou si tel que prévu, est bien). Cela fonctionne pour le cas de jeu et le formulaire est instancié lors du double-clic sur le formulaire. Il doit être que dans le cas de jouer les deux boîtes de message de contrôle de l'utilisateur, l'un était le mode de conception devenv.exe et l'autre était l'exécutable réel. – barlop

+0

peut-être une autre solution de contournement est de ne pas avoir de code dans la méthode de chargement, et d'avoir par exemple une méthode que l'on pourrait appeler "init", et le formulaire appelle la méthode "init" du contrôle. Tout code qui était dans le chargement, est mis dans l'init. – barlop