WinFomsプロジェクトがあると仮定します。ボタンは1つだけです(例:button1
)。
問題は、実際にクリックすることなく、コードを介してButtonClicked
イベントをトリガーすることは可能ですか?
ボタンコントロールには、呼び出すことができるPerformClick()メソッドがあります。
button1.PerformClick();
.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);
}
}
イベントハンドラー関数を直接呼び出して、送信者に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ロジックを分離できるという利点があります。コントロールイベントハンドラにビジネスロジックを含めることは絶対にしないでください。
はい、他のメソッドを呼び出すのと同じ方法でメソッドを呼び出してください。例えば:
private void btnSayHello_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello World!");
}
private void btnTriggerHello_Click(object sender, EventArgs e)
{
btnSayHello_Click(null, null);
}
button1.PerformClick();
しかし、このようなことをする必要がある場合は、イベントの下にあるコードを新しいメソッドに移動する方が良いでしょうか?
イベントコードをメソッドに入れてみませんか。次に、イベントにメソッドを実行させます。イベントが発生するのと同じコードを実行する必要がある場合は、この方法でできますが、単に「メソッド」を呼び出すだけです。
void Event_Method()
{
//Put Event code here.
MessageBox.Show("Hello!");
}
void _btnSend_Click(object sender, EventArgs e)
{
Event_Method();
}
void AnotherMethod()
{
Event_Method();
}
理にかなっていますか?これで、「クリック」イベントおよびコード内の任意の場所で、「クリック」イベントと同じコードをトリガーできます。
イベントをトリガーしないで、イベントが呼び出すメソッドを呼び出します。 ;)