2010-03-17 5 views
0

J'ai créé un formulaire qui est utilisé pour ajouter et modifier un objet personnalisé. Le mode utilisé par le formulaire est fourni par une valeur enum transmise par le code appelant. Je passe également dans un objet du type personnalisé. Tous mes contrôles sur les données liées aux propriétés spécifiques de l'objet personnalisé. Lorsque le formulaire est en mode Ajouter, cela fonctionne très bien lorsque les contrôles sont mis à jour avec des données, l'objet sous-jacent est également bien. Cependant, en mode Édition, je garde deux variables de l'objet personnalisé fournies par le code appelant, l'original, et une temporaire faite par la copie profonde. Les contrôles sont ensuite liés à la copie temporaire, ce qui facilite le rejet des modifications si l'utilisateur clique sur le bouton Annuler. Ce que je veux savoir, c'est comment conserver ces changements à l'objet d'origine si l'utilisateur clique sur le bouton OK, car il y a maintenant une déconnexion à cause de la copie en profondeur. J'essaye d'éviter d'implémenter une propriété interne sur le formulaire Add/Edit si je peux. Ci-dessous un exemple de mon code:Les objets persistants passent du formulaire enfant au formulaire parent en fonction de la pression du bouton


public AddEditCustomerDialog(Customer customer, DialogMode mode) 
{ 
    InitializeComponent(); 
    InitializeCustomer(customer, mode); 
} 
private void InitializeCustomer(Customer customer, DialogMode mode) 
{ 
    this.customer = customer; 
    if (mode == DialogMode.Edit) 
    { 
     this.Text = "Edit Customer"; 
     this.tempCustomer = ObjectCopyHelper.DeepCopy(this.customer); 
     this.customerListBindingSource.DataSource = this.tempCustomer; 
     this.phoneListBindingSource.DataSource = this.tempCustomer.PhoneList; 
    } 
    else 
    { 
     this.customerListBindingSource.DataSource = this.customer; 
     this.phoneListBindingSource.DataSource = this.customer.PhoneList; 
    } 
} 

Répondre

0

Vous pouvez toujours ajouter une fonction à votre objet (client), soit en tant que « Copier (Cust client) » ou « Mise à jour (Cust client) » et consommer les changements façon. L'autre manière serait d'avoir une classe wrapper autour de Customer EditableCustomer, qui prend un objet client dans son constructeur EditableCustomer (Client root) et l'utilise pour contenir les changements. Dans l'événement final, il suffit d'appeler une fonction comme "UpdateRoot()" et de remplir les modifications au client d'origine, à défaut d'appeler cela sera la même chose que d'une défausse.

Vous ne serez pas en mesure d'utiliser des copies profondes directement, mais cela vous permettra de contrôler ce type de situation, et vous permettra en fait de contrôler dynamiquement les modifications et les annulations.

+0

J'aime l'idée de la classe wrapper si je pouvais la rendre générique. Le client est l'une des nombreuses classes personnalisées que j'aimerais pouvoir modifier de cette manière et je veux éviter d'avoir à implémenter une méthode de copie pour chacun, et une classe/interface de base est hors de question car chaque classe est seulement liés en étant des propriétés d'une autre classe. – Shyran

+0

Dans l'intérêt du temps, il semblerait que je vais devoir aller avec l'implémentation Copier (objet). Merci pour votre réponse. – Shyran

Questions connexes