web-dev-qa-db-ja.com

プログラムでトリガーコントロールのイベント

WinFomsプロジェクトがあると仮定します。ボタンは1つだけです(例:button1)。

問題は、実際にクリックすることなく、コードを介してButtonClickedイベントをトリガーすることは可能ですか?

28
steavy

ボタンコントロールには、呼び出すことができるPerformClick()メソッドがあります。

button1.PerformClick();
40
itsme86

.NETフレームワークは、すべてのイベントXに対して、イベントXを発生させるメソッドprotected void OnX(EventArgs e) {}があるパターンを使用します。こちらをご覧ください Msdn article 。宣言クラスの外部からイベントを発生させるには、クラスを派生させ、パブリックラッパーメソッドを追加する必要があります。 Buttonの場合、次のようになります。

class MyButton : System.Windows.Forms.Button
{

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

}
22
TomBot

イベントハンドラー関数を直接呼び出して、送信者にnullを指定し、EventArgs.Empty引数。

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

または、ロジックをButtonClickedイベントから独自の関数に移動し、イベントハンドラーと他のコードが新しい関数を呼び出します。

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

後者の方法には、ビジネスロジックとUIロジックを分離できるという利点があります。コントロールイベントハンドラにビジネスロジックを含めることは絶対にしないでください。

15
Cᴏʀʏ

はい、他のメソッドを呼び出すのと同じ方法でメソッドを呼び出してください。例えば:

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

しかし、このようなことをする必要がある場合は、イベントの下にあるコードを新しいメソッドに移動する方が良いでしょうか?

4
coolmine

イベントコードをメソッドに入れてみませんか。次に、イベントにメソッドを実行させます。イベントが発生するのと同じコードを実行する必要がある場合は、この方法でできますが、単に「メソッド」を呼び出すだけです。

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

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

void AnotherMethod()
{
    Event_Method();
}

理にかなっていますか?これで、「クリック」イベントおよびコード内の任意の場所で、「クリック」イベントと同じコードをトリガーできます。

イベントをトリガーしないで、イベントが呼び出すメソッドを呼び出します。 ;)

3
IamBatman