以编程方式触发控件的事件
假设我有一个WinFoms项目。 只有一个按钮(例如button1
)。
问题是:是否可以通过代码触发ButtonClicked
事件而无需单击它?
按钮控件具有可以调用的PerformClick()方法。
button1.PerformClick();
.NET框架使用一种模式,其中对于每个事件X
都有一个方法protected void OnX(EventArgs e) {}
,它引发了事件X
看到这篇Msdn文章 。 要从声明类外部引发事件,您必须派生类并添加公共包装器方法。 在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();
但是如果你必须做这样的事情,或许最好将新事件下的事件代码移动到新方法中?
为什么不直接将事件代码放入Method中。 然后让Event执行该方法。 这样,如果你需要执行事件上升的相同代码,你可以,但只需调用“方法”。
void Event_Method() { //Put Event code here. MessageBox.Show("Hello!"); } void _btnSend_Click(object sender, EventArgs e) { Event_Method(); } void AnotherMethod() { Event_Method(); }
合理? 现在,“Click”事件和代码中的任何位置都可以触发与“Click”事件相同的代码。
不要触发事件,调用事件调用的方法。 ;)
使用for循环来调用button_click事件
private void btnadd_Click(object sender, RoutedEventArgs e) { for (int i = 0; i <= 2; i++) StuffThatHappensOnButtonClick(); } void StuffThatHappensOnButtonClick() { ........do stuff }
我们假设您至少需要一次点击按钮