IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Annuler un évènement


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 247
    Par défaut Annuler un évènement
    Bonjour,
    je dispose d'une interface graphique depuis laquelle je lance un évènement lorsqu'un composant particulier est activé.

    J'aimerais pouvoir annuler cet évènement selon certaines conditions depuis le delegate.

    Je vous fournis quelques exemples de code qui seront certainement plus parlant:

    Voici l'interface qui declare l'évènement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface ITab
    {
    	event EventHandler OnTabChanged;
    }
    Voici une classe pour passer des arguments personnels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class TabEventArgs : EventArgs
    {
    	public int previousIndex;
     
    	public TabEventArgs (int previousActiveView) : base()
    	{
    		previousIndex = previousActiveView;
    	}
    Voici une méthode de l'implémentation dans laquelle je lance l'évènement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void ChangeTab(int index)
    {
    	int previousActiveView = GetIndexActiveView ();
     
    	EventHandler handler = PreTabChangedEvent;
    	if (handler != null)
     
    	{
    		handler(this, new TabEventArgs(previousActiveView));
    	}
     
            //du code ensuite....
    }
    Voici dans le programme comment je traite l'évènement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    AppContainer main = AppContainer.getMainViewController();
     
    ITab m = (ITab)main;
    m.OnTabChanged += (object sender, EventArgs e) => {
    	m_OnTabChanged(sender,(TabEventArgs) e);
    };
    void m_OnTabChanged(object sender, TabEventArgs e)
    {
    	int previous = e.previousIndex;
    	if (previous == 3) {	
    		ShowMessageBox (200, 200, "Previous tab was Tab " + (previous + 1));
    	}
    }
    C'est dans la methode m_OnTabChanged que j'aimerais annuler la suite de l'évènement.

    Cela est il possible ?

    C'est mon premier projet .NET, merci pour votre aide.

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Tu peux remplacer EventArgs par CancelEvenArgs, par exemple (http://msdn.microsoft.com/fr-be/libr...eventargs.aspx)

    Après, il y a deux façon. Soit c'est fait du côté "client", c'est à dire que dans ton event handler tu regarde si Cancel est à true ou pas, et tu fais selon. Ca implique que tu fais confiance à ceux qui vont se registrer à l'event car rien ne les oblique à regarder si Cancel est à true.

    Ou alors tu le fais lors de l'invocation de l'evenement. Au lieu de
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (handler != null)
     
    	{
    		handler(this, new TabEventArgs(previousActiveView));
    	}

    Tu auras un truc style :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (handler != null)
    	{
                var eventarg = new TabEventArgs(previousActiveView);
                foreach (EventHandler del in handler.GetInvocationList())
                {
                    if (eventarg.Cancel)
                        break;
                    del(this,eventarg);
                }
             }

    Comme ça, lorsque la propriété Cancel passe à true, il arrête d'appeler les délégates.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 247
    Par défaut
    Je ne sais pas si j'ai bien compris ou si je me suis bien fait comprendre.

    J'aimerais que ce soit le delegate qui annule l'événement.
    J'ai essayé de faire hériter TabEventArgs de CancelEventArgs, dans mon delegate je passe Cancel à true mais if (eventarg.Cancel) est toujours false dans le foreach.

    En fait je suis parvenu à mes fins en faisant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    EventHandler handler = PostTabChangedEvent;
    var eventarg = new TabEventArgs(previousActiveView);
    if (handler != null)
     
    {
    	handler(this, eventarg);
    }
     
     
    foreach (EventHandler del in handler.GetInvocationList())
    {
    	if (eventarg.Cancel)
    	{
    		Console.WriteLine ("cancel");
    	} else {
    		Console.WriteLine ("not cancel");
    	}
     
    }
    La méthode vous semble bonne ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par enzostar Voir le message
    J'ai essayé de faire hériter TabEventArgs de CancelEventArgs, dans mon delegate je passe Cancel à true mais if (eventarg.Cancel) est toujours false dans le foreach.
    Voilà qui est bizarre... tu as du te tromper quelque part. Peux-tu montrer le code en question ?

    EDIT: en fait dans le code de GuruuMeditation le if (eventarg.Cancel) dans la boucle est avant l'appel du handler. Donc lors de la première itération, eventarg.Cancel sera effectivement à false, mais ça ne change pas grand chose au final...

    Citation Envoyé par enzostar Voir le message
    En fait je suis parvenu à mes fins en faisant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    EventHandler handler = PostTabChangedEvent;
    var eventarg = new TabEventArgs(previousActiveView);
    if (handler != null)
     
    {
    	handler(this, eventarg);
    }
     
     
    foreach (EventHandler del in handler.GetInvocationList())
    {
    	if (eventarg.Cancel)
    	{
    		Console.WriteLine ("cancel");
    	} else {
    		Console.WriteLine ("not cancel");
    	}
     
    }
    La méthode vous semble bonne ?
    Pas vraiment...
    - ça n'a pas de sens de boucler sur GetInvocationList : vu que de toutes façons tu n'utilises pas la variable de boucle, tu refais exactement la même chose à chaque itération. Tu peux carrément enlever le foreach...
    - en appelant directement handler(this, eventarg), tu invoques directement tous les handlers ; même si le premier met Cancel à true, les suivants seront quand-même exécutés. Cela dit, c'est peut-être ce que tu veux...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 247
    Par défaut
    Merci à vous pour vos réponses, je suis parvenu à ce que je souhaitais.

    Effectivement le foreach ne servait à rien.
    Invoquer directement tous les handler est bien ce que je souhaitais faire.
    Je veux juste savoir si cancel est passé à true ou que ce soit et en fonction de cela réaliser une opération ou pas.

    Voici le code au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    private void ChangeTab(int index)
    {
    	int previousActiveView = GetIndexActiveView ();
    	int nextActiveView = index;
     
    	EventHandler handler = PostTabChangedEvent;
    	var eventarg = new TabEventArgs(previousActiveView, nextActiveView);
    	if (handler != null)
     
    	{
    		handler(this, eventarg);
    	}
     
    	if (!eventarg.Cancel)
    	{
    		DisplayView(index);
    	}
    }
    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/06/2009, 13h22
  2. Réponses: 0
    Dernier message: 19/01/2009, 17h42
  3. Réponses: 4
    Dernier message: 21/02/2006, 11h39
  4. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo