Question

Est-il possible dans n'importe quel contexte de pouvoir accomplir cela?

Mes circonstances actuelles sont les suivantes:

public class CustomForm : Form
{
    public class CustomGUIElement
    {
    ...
        public event MouseEventHandler Click;
        // etc, and so forth.
    ...
    }

    private List<CustomGUIElement> _elements;

    ...

    public void CustomForm_Click(object sender, MouseEventArgs e)
    {
        // we might want to call one of the _elements[n].Click in here
        // but we can't because we aren't in the same class.
    }
}

Ma première pensée a été d’avoir une fonction similaire à:

internal enum GUIElementHandlers { Click, ... }
internal void CustomGUIElement::CallHandler(GUIElementHandler h, object[] args) {
    switch (h) {
        case Click:
            this.Click(this, (EventArgs)args[0]);
            break;
        ... // etc and so forth
    }
}

C’est un vilain horriblement moche, mais ça devrait marcher ... Il doit y avoir une solution plus élégante cependant? La bibliothèque .NET le fait tout le temps avec des gestionnaires de messages et des événements appelants dans Control. Quelqu'un d'autre a-t-il d'autres idées / meilleures idées?

Était-ce utile?

La solution

Vous devez simplement ajouter une méthode publique pour appeler l'événement. Microsoft le fait déjà pour certains événements tels que PerformClick pour les contrôles qui exposent un événement Cliquez .

public class CustomGUIElement    
{
    public void PerformClick()
    {
        OnClick(EventArgs.Empty);
    }

    protected virtual void OnClick(EventArgs e)
    {
        if (Click != null)
            Click(this, e);
    }
}

Vous feriez ensuite ce qui suit dans votre exemple de gestionnaire d'événements ...

public void CustomForm_Click(object sender, MouseEventArgs e)        
{
    _elements[0].PerformClick();
}

Autres conseils

Le mot clé event en c # modifie la déclaration du délégué. Il empêche l’affectation directe au délégué (vous pouvez uniquement utiliser + = et - = pour un événement) et empêche l’appel du délégué de l’extérieur de la classe.

Vous pouvez donc modifier votre code afin qu'il ressemble à ceci:

public class CustomGUIElement
{
...
    public MouseEventHandler Click;
    // etc, and so forth.
...
}

Vous pouvez ensuite appeler l'événement de l'extérieur de la classe comme ceci.

myCustomGUIElement.Click(sender,args);

L’inconvénient est que le code utilisant la classe peut écraser très facilement les gestionnaires enregistrés avec un code comme celui-ci:

myCustomGUIElement.Click = null;

ce qui n'est pas autorisé si le délégué Click est déclaré en tant qu'événement.

Vous devriez vraiment inclure le code que vous voulez pouvoir exécuter de l'extérieur dans une méthode. Cette méthode peut alors faire ce que votre événement ferait - et cet événement appellerait également cette méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top