WinFomsプロジェクトがあると仮定します。ボタンは1つだけです(例button1
)。
ButtonClicked
問題は、実際にクリックせずにコードを介してイベントをトリガーすることは可能ですか?
ボタン コントロールには、呼び出すことができる PerformClick() メソッドがあります。
button1.PerformClick();
.NET フレームワークは、イベントごとに eventを発生させるX
メソッドがあるパターンを使用します。このMSDN の記事を参照してください。宣言クラスの外部からイベントを発生させるには、クラスを派生させ、パブリック ラッパー メソッドを追加する必要があります。その場合、次のようになります。protected void OnX(EventArgs e) {}
X
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();
しかし、このようなことをしなければならない場合は、イベントの下にあるコードを新しいメソッドに移動する方がよいでしょうか?