2010-06-03 5 views
0

J'ai un VERY simple formulaire de Windows que l'utilisateur utilise pour gérer "Magasins".Conseils sur un formulaire Windows simple

Chaque magasin a un nom et un numéro et est conservé dans une table DB correspondante.

Le formulaire comporte une zone de liste de magasins, un bouton d'ajout qui crée un nouveau magasin, un bouton de suppression et un bouton d'édition. A côté de ceux-ci, j'ai des zones de texte pour le nom et le numéro, et des boutons de sauvegarde/annulation. Lorsque l'utilisateur choisit un magasin dans la zone de liste et clique sur 'modifier', les zones de texte sont remplies et les fonctions Enregistrer/Annuler deviennent actives. Lorsque l'utilisateur clique sur 'ajouter', je crée un nouveau magasin, l'ajoute à la liste, active les zones de texte et enregistre/annule les boutons, puis le valide dans la base de données lorsque l'utilisateur clique sur 'sauvegarder' ou le supprime lorsque l'utilisateur clique 'Annuler'.

En ce moment, mon système d'événements ressemble à ceci (en pseudo-code. Il est juste plus court de cette façon.)

add->click: 
    store = new Store() 
    listbox.add(store) 
    populateAndEdit(store) 

delete->click: 
    store = listbox.selectedItem 
    db.deleteOnSubmit(store) 
    listbox.remove(store) 
    db.submit() 

edit->click: 
    populateAndEdit(listbox.selectedItem) 

save->click: 
    parseAndSave(listbox.selectedItem) 
    db.submit() 
    disableTexts() 

cancel->click: 
    disableTexts() 

Le problème est dans la façon dont je déterminerons si nous insérons un nouveau magasin, ou la mise à jour un existant. La solution évidente pour moi serait de faire un processus "modal" - c'est-à-dire, lorsque je clique sur edit, je passe en mode édition, et le bouton save fait les choses différemment que si j'étais en mode add.

Je sais que je pourrais rendre cela plus semblable à MVC, mais je ne pense pas vraiment que cette forme simple mérite la complexité ajoutée. Je ne suis pas très expérimenté avec les winforms, donc je ne suis pas sûr d'avoir la bonne idée de la manière de résoudre ce problème.

Y a-t-il une meilleure façon de procéder? Je voudrais le garder simple, mais utilisable.

Répondre

3

Vous avez sûrement un identifiant dans la base de données? Votre objet exposerait cette clé primaire en tant que propriété StoreID ou ID par exemple. Si c'est un GUID, ce sera Guid.Empty pour un nouvel objet, s'il s'agit d'un entier auto-incrémenté, il serait nul. Lorsque vous l'enregistrez dans la base de données, il doit obtenir un ID valide, puis vous pouvez facilement déterminer si l'objet est nouveau ou existant.

6

utilisez un certain type d'identificateur, c'est-à-dire le nom du magasin. Maintenant, lorsque l'utilisateur appuie sur Enregistrer, vérifiez si votre collection de magasins en contient déjà une avec le même nom. Si c'est le cas, c'est une mise à jour, sinon c'est un nouveau magasin.

Je me rends compte que l'utilisation du nom du magasin peut ne pas être possible pour vous (c'est-à-dire un supermarché avec de nombreuses succursales), mais vous en avez l'idée.

+0

+1 Je suis d'accord avec ça. – galford13x

0

Vous pouvez vérifier une sorte d'identifiant unique comme mentionné précédemment, ou dans le cadre que ma société utilise (CSLA .NET) il y a un champ booléen IsNew sur nos objets, que lorsque nous créons un nouvel objet, le champ est marqué vrai . Lorsque des données sont lues dans l'objet à partir de la base de données, le champ IsNew est marqué comme faux. Cela vous donne la possibilité d'utiliser le nouveau constructeur par défaut dans tous les cas, puis lorsque vous remplissez un élément existant, faîtes-le.

-1

Vous pouvez simplement jouer avec le texte de votre bouton de sauvegarde, juste au cas où le nouveau magasin changerait son texte pour "Insérer un magasin" et dans le cas d'éditer ce serait "Mettre à jour le magasin".

add->click: 
store = new Store() 
listbox.add(store) 
save.Text="Insert Store" 
populateAndEdit(store) 

delete->click: 
store = listbox.selectedItem 
db.deleteOnSubmit(store) 
listbox.remove(store) 
db.submit() 


edit->click: 
save.Text="Update Store" 
populateAndEdit(listbox.selectedItem) 


save->click: 
parseAndSave(listbox.selectedItem) 
if (save.Text.Equals("Insert Store")) 
    db.InsertOnSubmit(listbox.selectedItem)  
db.submit() 
disableTexts() 


cancel->click: 
disableTexts() 

Espérons que cela aide!

+0

Ce n'est pas une bonne idée d'utiliser le texte d'un contrôle d'interface utilisateur afin de déterminer le comportement d'un programme. –

0

Dans votre situation, vous voudrez peut-être stocker plus qu'une simple chaîne dans la liste. Avez-vous des objets de domaine représentés par les valeurs listbox? Ajoutez-les à la zone de liste à la place - assurez-vous de remplacer le .ToString() pour que la listbox finisse par visualiser quelque chose de significatif. Lorsque l'utilisateur sélectionne Ajouter, créez un nouvel objet de domaine et ajoutez it à la zone de liste, en vérifiant que la propriété appropriée est définie pour marquer ceci comme un nouvel enregistrement à insérer dans la base de données. À l'inverse, tous les enregistrements conservés dans la base de données, ainsi que tous les enregistrements existants extraits de la base de données, peuvent être marqués de manière appropriée afin que vous puissiez gérer les modifications et les suppressions nécessaires.

+0

Oui, déjà en train de le faire. Chaque magasin lui-même est stocké dans la liste. –

Questions connexes