2009-09-05 10 views
0

Je suis novice en programmation et j'ai du mal à comprendre la durée de vie/l'instanciation de l'objet.Durée de vie de plusieurs instances d'un objet/modèle de conception

J'ai une fenêtre de avec un datagridview et un panneau.

La vue datagrid dispose d'une colonne de cases à cocher et d'une liste de noms qui est renseignée à partir d'une base de données.

Le panneau comporte quelques zones de texte (par exemple, le nom, l'âge, l'équipe sportive favorite) et un bouton «enregistrer les modifications». L'idée est que lorsque l'utilisateur sélectionne une personne dans la grille de données en cochant la case appropriée, le panneau affiche les données pertinentes pour cette personne (nom, âge, équipe sportive favorite) en extrayant les données d'une base de données. Si l'utilisateur souhaite mettre à jour les détails de la personne, il peut le faire en tapant les zones de texte, puis en cliquant sur le bouton «enregistrer les modifications». Tout est assez simple jusqu'à présent.

La façon dont j'ai conçu cela est d'avoir une classe 'panel' et de créer une instance lorsque l'utilisateur cocher une case. (NB - la raison pour laquelle j'ai créé une classe 'panel' est que j'ai l'intention de répliquer datagridview et panel sur d'autres tabges dans mon formulaire et j'ai pensé qu'il serait utile d'avoir une classe générique 'panel' que je pourrais réutiliser .)

Mon code ressemble un peu à ceci:

If CheckBoxClicked Then 
Dim UpdatePanel As New UpdatePanel(MyForm.NameTextBox, MyForm.AgeTextBox, MyForm.FavSportTeamTextBox, MyForm.SaveButton) 
UpdatePanel.GetData() 
... 

Lorsque l'utilisateur clique sur le bouton Enregistrer les données sont mises à jour à la base de données et j'ai un message d'affichage (zone de texte simple,) qui dit « Mise à jour réussie » et affiche pendant 5 secondes avant de se cacher.

Voici le problème:

Supposons qu'un utilisateur vérifie une case à cocher, passe en revue les données et ne fait pas de changement, et vérifie ensuite une autre case à cocher et décide de mettre à jour les données en cliquant sur le bouton « Enregistrer les modifications ». Ce qui se passe est que le message "Mise à jour réussie" est affiché deux fois.

Je pense que c'est parce que chaque fois que l'utilisateur coche une case, une instance de UpdatePanel est créée. Si je sélectionne cinq personnes différentes en utilisant les cases à cocher, puis cliquez sur «enregistrer les modifications», je reçois cinq messages «Mettre à jour avec succès».

Je ne sais pas comment surmonter cela. Il semble que chaque fois que l'on clique sur une case à cocher, j'ai besoin de vérifier si une instance de UpdatePanel existe, puis de le détruire. J'ai essayé d'employer UpdatePanel = Nothing et ai également examiné IDisposable et GC.Collect() mais sans la chance.

Mes questions sont les suivantes:

  1. Comment puis-je faire en sorte que seule instance du panneau est créé?
  2. Si je crée plusieurs instances de le même objet avec le même nom -ils tous assis en mémoire ou ne le « ordinateur » ne conservent qu'une référence le plus récemment créé ? (Y a-t-il pas un nom conflit?)
  3. Ai-je descendu la mauvaise piste avec mon modèle de dessin et l'utilisation de la classe «panneau»?

Merci

Répondre

0

Assurez-vous que vous vérifiez s'il y avait des changements ou non avant la mise à jour du db. Probablement à tout moment l'utilisateur examine une donnée que vous avez quelque chose qui ajoute une mise à jour unique. Il serait plus facile de répondre si vous postez plus de code car vos explications ne sont pas très claires et il est difficile de dire où est le problème sans voir la plupart du code impliqué.

  1. Utilisez le motif singleton

  2. Cela dépend de la façon dont vous les créer. L'objet créé dans la portée de la méthode est marqué à la suppression et attend GC pour le recueillir. Si vous avez vos objets stockés dans une variable de votre WinForm, il les conservera du GC. Donc, par défaut, l'objet est en train de mourir mais vous pouvez le faire vivre plus longtemps. Notez également que l'heure du chromatographe en phase gazeuse n'est pas déterminée et que vous ne savez jamais quand le chromatographe en phase gazeuse fonctionnera et détruira les objets.

  3. Il s not clear what was done, so if you post the code I ll sera en mesure de répondre à cette question.

Questions connexes