web-dev-qa-db-fra.com

Déclencher l'événement du contrôle par programme

Supposons que j'ai un projet WinFoms. Il n'y a qu'un seul bouton (par exemple button1).

La question est: est-il possible de déclencher l'événement ButtonClicked via du code sans vraiment cliquer dessus?

28
steavy

Les contrôles de bouton ont une méthode PerformClick () que vous pouvez appeler.

button1.PerformClick();
40
itsme86

Le framework .NET utilise un modèle où pour chaque événement X, il existe une méthode protected void OnX(EventArgs e) {} qui déclenche l'événement X. Voir ceci article Msdn . Pour déclencher un événement en dehors de la classe déclarante, vous devrez dériver la classe et ajouter une méthode de wrapper public. Dans le cas de Button, cela ressemblerait à ceci:

class MyButton : System.Windows.Forms.Button
{

    public void ProgrammaticClick(EventArgs e)
    {
        base.OnClick(e);
    }

}
22
TomBot

Vous pouvez simplement appeler directement la fonction de gestionnaire d'événements et spécifier null pour l'expéditeur et EventArgs.Empty pour les arguments.

void ButtonClicked(object sender, EventArgs e)
{
    // do stuff
}

// Somewhere else in your code:
button1.Click += new EventHandler(ButtonClicked);

// call the event handler directly:
ButtonClicked(button1, EventArgs.Empty);

Ou plutôt, vous déplaceriez la logique de l'événement ButtonClicked dans sa propre fonction, puis votre gestionnaire d'événements et l'autre code que vous auriez appelleraient à leur tour la nouvelle fonction.

void StuffThatHappensOnButtonClick()
{
    // do stuff
}

void ButtonClicked(object sender, EventArgs e)
{
    StuffThatHappensOnButtonClick();
}

// Somewhere else in your code:
button1.Click += new EventHandler(ButtonClicked);

// Simulate the button click:
StuffThatHappensOnButtonClick();

Cette dernière méthode a l'avantage de vous permettre de séparer votre entreprise et votre logique d'interface utilisateur. Vous ne devriez vraiment jamais avoir de logique métier dans vos gestionnaires d'événements de contrôle.

15
Cᴏʀʏ

Oui, appelez simplement la méthode de la même façon que vous en appelleriez une autre. Par exemple:

    private void btnSayHello_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Hello World!");
    }

    private void btnTriggerHello_Click(object sender, EventArgs e)
    {
        btnSayHello_Click(null, null);
    }
6
Tarzan
button1.PerformClick();

Mais si vous devez faire quelque chose comme ça, il vaut peut-être mieux déplacer le code que vous avez sous l'événement sur une nouvelle méthode?

4
coolmine

Pourquoi ne mettez-vous pas simplement votre code d'événement dans une méthode. Demandez ensuite à l'événement d'exécuter la méthode. De cette façon, si vous devez exécuter le même code que l'événement, vous pouvez, mais simplement en appelant la "méthode".

void Event_Method()
{
    //Put Event code here.
    MessageBox.Show("Hello!");
}

void _btnSend_Click(object sender, EventArgs e)
{
    Event_Method();
}

void AnotherMethod()
{
    Event_Method();
}

Ça a du sens? Maintenant, l'événement "Click" ET n'importe où dans le code, vous pouvez déclencher le même code que l'événement "Click".

Ne déclenchez pas l'événement, appelez la méthode que l'événement appelle. ;)

3
IamBatman