2010-07-21 8 views
0

J'écris une application C# .NET. J'ai un formulaire. Lorsque le formulaire est créé, je crée une instance d'une classe. Lorsque je ferme le formulaire, je veux disposer de la classe afin que la prochaine fois que j'ouvre le formulaire, je puisse simplement créer une nouvelle instance de la classe. Donc, dans l'événement form_Closing j'ai ajouté un code comme ceci: classInstance = null; Le problème est, pour une raison quelconque, la prochaine fois que j'ouvre le formulaire, la classe n'est pas égale à zéro mais plutôt dans le même état qu'avant la fermeture la forme. Pourquoi cela arrive-t-il?Comment puis-je réinitialiser une classe?

EDIT: Ajout d'informations:

myHandler est un champ dans la classe Form. il ressemble à ceci:

private HSFW_Handler myHandler; 

La classe que je fais référence est un singleton si je crée comme ceci:

public static HSFW_Handler GetInstance() 
    { 
     if (myHSFW == null) 
     { 
      myHSFW = new HSFW_Handler(); 
      return myHSFW; 
     } 
     else return myHSFW; 
    } 

je créer une instance initiale de celui-ci en cas Form_Shown

private void SetupDialogForm_Shown(object sender, EventArgs e) 
    { 
     try 
     { 
      myHandler = HSFW_Handler.GetInstance(); 
      UpdateDisplay(); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

La clôture du formulaire ressemble à ceci ...

private void SetupDialogForm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     myHandler = null; 
    } 
+0

Pouvez-vous réduire à un extrait qui illustre le problème. Le code de création/show de formulaire et le code de fermeture. – ChrisF

+1

"Lorsque le formulaire est créé, je crée une instance d'une classe." - Êtes-vous sûr de ne pas créer une autre instance de cette classe lorsque vous ouvrez le formulaire la prochaine fois? – dtb

+0

Il se passe probablement autre chose. Que faites-vous d'autre à la classe? – MCain

Répondre

3

Regardons à ce code:

public static HSFW_Handler GetInstance() 
{ 
    if (myHSFW == null) 
    { 
     myHSFW = new HSFW_Handler(); 
     return myHSFW; 
    } 
    else return myHSFW; 
} 

Et ceci:

private void SetupDialogForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    myHandler = null; 
} 

quoi que ce soit d'avis? Vous définissez myHandler à null; mais cela semble être un membre de niveau d'instance de SetupDialogForm. Ou de toute façon, ce n'est pas la même chose que myHSFW, qui est votre variable statique dans la classe HSFW_Handler.

Quand vous faites cela ...

myHandler = HSFW_Handler.GetInstance(); 

... vous faites myHandler une référence au même objet pointé par HSFW_Handler.myHSFW; mais ils sont toujours deux références distinctes. Définir un sur null n'a aucun impact sur l'autre. Le point de tout cela est que vous devez réellement changer la valeur de myHSFW à null pour obtenir le comportement que vous semblez vouloir.

Je ferais comme ça:

public class HSFW_Handler 
{ 
    public static void DeleteInstance() 
    { 
     myHSFW = null; 
    } 
} 

Puis:

private void SetupDialogForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    HSFW_Handler.DeleteInstance(); 
} 
+0

hmmm Je vois ce que tu veux dire mais je l'ai essayé et ça ne semble toujours pas fonctionner ... – PICyourBrain

+0

@Jordan: Que contient ton constructeur 'HSFW_Handler'? –

+0

En fait, je viens de l'avoir. Votre solution a fonctionné, j'ai juste dû mettre une autre chose à zéro aussi bien. Merci. – PICyourBrain

0

Etes-vous sûr que l'événement form_Closing est déclenché, afin de fermer le formulaire et de ne pas le masquer? Si c'est le cas, effectuez une recherche dans le code en recherchant chaque fois que classInstance est défini sur quelque chose.

Vous trouverez probablement le coupable dans ou autour du constructeur ou un autre événement tel que Load ou Shown.

+0

Oui, je suis sûr qu'il est viré. Voir le code que j'ai ajouté ci-dessus. – PICyourBrain