2009-11-05 4 views
2

nous avons un UserControl pour gérer les annulations d'utilisateurs, qui est utilisé dans quelques endroits. Cela a quelques champs de saisie et un bouton de soumission. Quand ils soumettent le statut de l'utilisateur est mis à jour et quelques autres choses sont faites et un message de rétroaction affiché.Comment savoir quand un UserControl a fini de déclencher un événement?

Sur l'une des pages qui contient le contrôle, après que l'utilisateur a annulé avec succès sa soumission via UserControl nous avons besoin que la page soit notifiée pour pouvoir appeler une de ses méthodes et mettre à jour son affichage [dans ce cas, le statut de l'utilisateur, qui était présent et est maintenant annulé].

Comment les relier? Je suppose que quelque chose impliquant des délégués et des gestionnaires d'événements, mais ne pas avoir beaucoup d'expérience avec eux, donc ne sais pas si je serais dans une impasse ...

Une solution très hacky serait pour le UserControl pour provoquer un re-direct et ensuite avoir la page surveiller la session ou un paramètre de chaîne de requête, etc., mais juste en tapant cela m'a fait frissonner alors je devrais être vraiment un dernier recours.

Si vous avez besoin de plus d'informations, merci de me le demander.

+0

Puisque vous dites 'paramètre de chaîne' et 'page', je suppose que vous parlez de formulaires Web et non de formulaires. – jwarzech

+1

J'ai redessiné à ASP.Net comme vous l'avez mentionné rediriger vers les pages. Si je me trompe et qu'il s'agit de winforms, n'hésitez pas à me corriger. – GenericTypeTea

+0

Oui, c'est pour le web, pas de bureau. – Rich

Répondre

2

Cela devrait être assez facile. Ajouter un événement délégué à votre UserControl comme suit:

public event EventHandler UserCancelled; 

Ensuite, dans votre contrôle utilisateur à la fin de la méthode d'annulation, il suffit d'appeler le délégué:

if (this.UserCancelled!= null) 
{ 
    this.UserCancelled(this, new EventArgs()); 
} 

Ensuite, ajoutez simplement un gestionnaire l'événement sur votre balisage ASPX de contrôle utilisateur:

OnUserCancelled="UserControl1_UserCancelled" 

Et enfin, ajouter un gestionnaire à votre page:

protected void UserControl1_UserCancelled(object sender, EventArgs e) 
{ 
    // Your code 
} 
+0

Juste pour ajouter l'édition d'eithout, vous n'avez pas besoin de mettre la partie "if (this.UserCancelled! = Null)" si vous utilisez toujours l'événement. Si vous ne voulez pas toujours capturer l'événement, le fait de vous assurer que le délégué n'est pas nul l'empêche d'entraîner une erreur. – GenericTypeTea

0

La méthode la plus simple consiste à créer un événement sur UserControl pour signaler que l'annulation a eu lieu. Ajouter un gestionnaire pour cela dans le formulaire d'origine et mettre à jour l'affichage quand il est déclenché.

-1

Si votre formulaire est une classe de votre propre conception tels que

public class MyForm : Form 
{ 
    public void MyCustomRefresh() 
    { 
    } 
} 

Ensuite, dans votre contrôle utilisateur personnalisé, je suppose que son utilisé sur plusieurs formes afin de permettre l'exploitation d'annuler comme vous l'avez ... puis, à la fin de votre code de tout événement/bouton, vous pouvez faire quelque chose comme

((MyForm)this.FindForm()).MyCustomRefresh() 

vous pouvez utiliser le « this.FindForm() » pour obtenir la forme, de type moulé à votre formulaire personnalisé définition que vous connaissez a une telle méthode "MyCustomRefresh()" et appelez-le directement. Aucun délégué requis.

+0

Il utilise ASP.Net. – GenericTypeTea

+0

Oui, désolé pour la confusion. – Rich

1

Je pense que votre instinct est correct. Vous pouvez résoudre ce problème en définissant un événement et un délégué personnalisés. Quelque chose dans ce sens devrait faire:

public delegate void CancelledUserHandler(); 

public partial class UserCancellationControl : System.Web.UI.UserControl 
{ 
    public event CancelledUserHandler UserCancelled; 

    protected void CancelButtonClicked(object sender, EventArgs e) 
    { 
     // process the user's cancellation 

     // fire off an event notifying listeners that a user was cancelled 
     if (UserCancelled != null) 
     { 
      UserCancelled(); 
     } 
    } 
} 

public partial class MyPage : System.Web.UI.Page 
{ 
    protected UserCancellationControl myControl; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     // hook up the ProcessCancelledUser method on this page 
     // to respond to cancellation events from the user control 
     myControl.UserCancelled += ProcessCancelledUser; 
    } 

    protected void ProcessCancelledUser() 
    { 
     // update the users status on the page 
    } 
} 
+0

C'était aussi une bonne réponse, mais elle a été battue par la réponse de GenericTypeTea. – Rich

+0

Heh, j'aimais regarder la réputation de ping-pong entre moi et Kyle. Merci d'avoir accepté ma réponse à la fin. – GenericTypeTea

+0

Ha, ouais, j'essayais de vous donner à la fois crédit. Merci les gars. – Rich

Questions connexes