it-swarm.com.de

Lösen Sie das Ereignis des Steuerelements programmgesteuert aus

Angenommen, ich habe ein WinFoms-Projekt. Es gibt nur eine Taste (z. B. button1).

Die Frage ist: Ist es möglich, das Ereignis ButtonClicked per Code auszulösen, ohne wirklich darauf zu klicken?

28
steavy

Schaltflächensteuerelemente verfügen über eine PerformClick () -Methode, die Sie aufrufen können.

button1.PerformClick();
40
itsme86

Das .NET Framework verwendet ein Muster, bei dem es für jedes Ereignis X eine Methode protected void OnX(EventArgs e) {} gibt, die das Ereignis X auslöst. Siehe hierzu Msdn-Artikel . Um ein Ereignis von außerhalb der deklarierenden Klasse auszulösen, müssen Sie die Klasse ableiten und eine öffentliche Wrapper-Methode hinzufügen. Im Fall von Button würde das so aussehen:

class MyButton : System.Windows.Forms.Button
{

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

}
22
TomBot

Sie können die Event-Handler-Funktion einfach direkt aufrufen und null für den Absender und EventArgs.Empty Für die Argumente angeben.

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);

Oder Sie verschieben die Logik aus dem ButtonClicked -Ereignis in eine eigene Funktion, und dann rufen der Ereignishandler und der andere Code, den Sie haben, die neue Funktion auf.

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();

Die letztere Methode bietet den Vorteil, dass Sie Ihre Geschäfts- und Benutzeroberflächenlogik voneinander trennen können. Sie sollten wirklich niemals eine Geschäftslogik in Ihren Steuerungsereignishandlern haben.

15
Cᴏʀʏ

Ja, rufen Sie die Methode einfach so auf, wie Sie jede andere aufrufen würden. Beispielsweise:

    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();

Aber wenn Sie so etwas tun müssen, ist es vielleicht besser, den Code, den Sie unter dem Ereignis haben, auf eine neue Methode zu verschieben?

4
coolmine

Warum fügst du nicht einfach deinen Ereigniscode in eine Methode ein? Lassen Sie dann das Event die Methode ausführen. Auf diese Weise können Sie, wenn Sie denselben Code ausführen müssen wie das Ereignis, einfach die "Methode" aufrufen.

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

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

void AnotherMethod()
{
    Event_Method();
}

Sinn ergeben? Jetzt können Sie mit dem "Click" -Ereignis UND an einer beliebigen Stelle im Code denselben Code wie mit dem "Click" -Ereignis auslösen.

Lösen Sie das Ereignis nicht aus, sondern rufen Sie die vom Ereignis aufgerufene Methode auf. ;)

3
IamBatman