2012-08-22 1 views
3

J'ai 2 WinForms où l'un est parent et passe le paramètre à sa forme chilf. Le code va quelque chose comme ceci:Comment informer la classe parente à propos du changement de propriété

public class FormMain : Form { 
private User user; 

public FormMain (User user) { 
InitializeComponent(); 
this.user = user; 
} 

private void btnUpdateAccount_Click(object sender, EventArgs e) 
     { 
      updateUser = new FormUsersUpdate(user); 
      updateUser.Show(); 
     } 
} 

et ceci:

public class FormUsersUpdate(User user){ 

//Update user in database 

} 

classe utilisateur ont des propriétés habituelles comme le nom, le nom, etc. Donc, ma question est de savoir comment informer classe parente de cette mise à jour sans besoin de récupérer à nouveau l'utilisateur de la base de données?

Merci.

+0

Pour informer la classe parent de la mise à jour? – franssu

Répondre

3

Vous pouvez appeler un délégué de rappel après la mise à jour. En FormMain:

private void btnUpdateAccount_Click(object sender, EventArgs e) 
{ 
    updateUser = new FormUsersUpdate(user, new Action<User>(OnUserUpdated)); 
    updateUser.Show(); 
} 

private void OnUserUpdated(User user) 
{ 
    // Whatever you wanted to do with the updated user. 
} 

En FormUsersUpdate:

public class FormUsersUpdate(User user, Action<User> callback) 
{ 
    // Update user, then invoke the callback using the updated user instance, 
    // which will call the OnUserUpdated method of the FormMain: 
    callback.Invoke(user); 
} 

ShowDialog est le plus souvent un meilleur choix mais je ne l'ai essayé sur un enfant IMD:

private void btnUpdateAccount_Click(object sender, EventArgs e) 
{ 
    updateUser = new FormUsersUpdate(user); 
    updateUser.ShowDialog(); 

    // Will wait until the user closes the dialog box. 
    // FormUserUpdate keeps the updated user in a property called User: 
    OnUserUpdated(updateUser.User); 
} 
+0

Les délégués sont utiles lorsque vous souhaitez appeler un événement sur le parent, mais pas dans cette situation. Il veut simplement transmettre l'objet au parent. – Menefee

+0

@Menefee: La façon la plus simple d'y parvenir est d'utiliser le ShowDialog et une propriété pour l'utilisateur mis à jour dans la classe FormUsersUpdate imho. Mais l'utilisation de délégués est également une solution valable, car appeler un délégué n'est pas plus lent que d'appeler une méthode régulière, je ne pense pas que cette approche ait un inconvénient important. –

+0

@Menefee: Et comment le parent saura-t-il que la valeur est modifiée si je n'appelle pas une méthode ou un délégué, ou si j'élève un événement? –

0

Si vous souhaitez simplement renvoyer les valeurs, exposez-les en tant que variables statiques publiques dans le parent et définissez-les dans la fenêtre enfant.

Parent:

public static User CurrentUser {get; set;} 

enfant:

FormMain.CurrentUser = user;  
FormMain.CurrentUser.LastName = "Menefee"; 
+1

Pas un bon usage des champs statiques .. que faire si vous voulez créer plusieurs FormMain? – franssu

+0

Comment le parent saura-t-il que 'FormUsersUpdate' est terminé et que CurrentUser contient la valeur mise à jour? –

+0

@franssu Je serais normalement d'accord mais étant donné les spécifications données, c'est la solution la plus simple. – Menefee

3

Certaines options:

  • Définir un événement UserUpdated sur votre deuxième forme, et le feu de l'événement lorsque des changements se produisent dans la Instance utilisateur
  • Implémentez INotifyPropertyChanged sur la classe User et gérez cet événement dans votre formulaire principal lorsqu'il est déclenché.
+0

Défini un délégué et un événement sur la classe FormUsersUpdate maintenant je suis incapable de déclencher un événement. Cela peut être dû au fait que FormUsersUpdate est une classe partielle. –

+0

Voir mes réponses à cette question sur la façon de définir un événement. http://stackoverflow.com/questions/12002820/update-view-from-another-view/12003071#12003071 – Maarten

+0

Merci j'ai rectifié l'erreur. Il fonctionne maintenant. –

0

Voici l'échantillon de travail pour la ci-dessus question en utilisant délégué et événement:

public partial class FormUsersUpdate : Form 
{ 
    private readonly User user; 
    public delegate void UserChangedEventHandler(object sender, EventArgs e); 
    public event UserChangedEventHandler UsrChanged; 

    private void InvokeUsrChanged() 
    { 
     var args = new EventArgs(); 
     if (UsrChanged != null) UsrChanged(this, args); 
    } 

    public FormUsersUpdate() 
    { 
     InitializeComponent(); 
    } 

    public FormUsersUpdate(User usr) 
    { 
     InitializeComponent(); 
     this.user = usr; 
     this.user.name = "Kishore"; 
    } 

    private void FormUsersUpdate_Load(object sender, EventArgs e) 
    { 
     InvokeUsrChanged(); 
    } 

} 

public partielle classe Form1: formulaire { privé Utilisateur utilisateur; FormUsersUpdate _frmusrUpdate;

public Form1() 
    { 
     InitializeComponent(); 
     this.user = new User { name = "Test" }; 
    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     _frmusrUpdate = new FormUsersUpdate(this.user); 
     _frmusrUpdate.UsrChanged += new FormUsersUpdate.UserChangedEventHandler(_frmusrUpdate_UsrChanged); 
     _frmusrUpdate.Show(); 
    } 

    void _frmusrUpdate_UsrChanged(object sender, EventArgs e) 
    { 
     MessageBox.Show("User Details Changed"); 
    } 
} 
Questions connexes