36

假设我有一个 WinFoms 项目。只有一个按钮(例如button1)。

问题是:是否可以ButtonClicked通过代码触发事件而无需真正单击它?

4

9 回答 9

48

按钮控件有一个可以调用的 PerformClick() 方法。

button1.PerformClick();
于 2012-08-29T18:52:36.420 回答
25

.NET 框架使用一种模式,其中每个事件X都有一个protected void OnX(EventArgs e) {}引发事件的方法X。请参阅此Msdn 文章。要从声明类外部引发事件,您必须派生该类并添加公共包装方法。在这种情况下,Button它看起来像这样:

class MyButton : System.Windows.Forms.Button
{

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

}
于 2012-08-29T19:59:05.003 回答
17

您可以直接调用事件处理函数并指定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 逻辑分开。你真的不应该在你的控制事件处理程序中有任何业务逻辑。

于 2012-08-29T18:52:46.377 回答
6

是的,只需像调用其他方法一样调用该方法。例如:

    private void btnSayHello_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Hello World!");
    }

    private void btnTriggerHello_Click(object sender, EventArgs e)
    {
        btnSayHello_Click(null, null);
    }
于 2012-08-29T18:57:41.640 回答
4
button1.PerformClick();

但是,如果您必须做这样的事情,也许最好将您在事件下的代码移动到新方法上?

于 2012-08-29T18:53:36.500 回答
3

你为什么不把你的事件代码放到一个方法中。然后让事件执行该方法。这样,如果您需要执行与事件发生相同的代码,则可以,但只需调用“方法”。

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

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

void AnotherMethod()
{
    Event_Method();
}

有道理?现在“点击”事件和代码中的任何地方都可以触发与“点击”事件相同的代码。

不触发事件,调用事件调用的方法。;)

于 2015-01-27T16:29:09.453 回答
0

在大多数情况下,您不需要这样做。只需将您的功能包装在与特定目的(任务)相关的功能中。您可以在您的事件中和其他任何需要的地方调用此函数。

过度考虑你的方法。

于 2019-12-03T12:26:58.377 回答
0

我最近遇到了这个问题,我想以编程方式单击一个分配了多个事件处理程序的按钮(想想 UserControl 或派生类)。

例如:

myButton.Click += ButtonClicked1
myButton.Click += ButtonClicked2;

void ButtonClicked1(object sender, EventArgs e)
{
    Console.WriteLine("ButtonClicked1");
}

void ButtonClicked2(object sender, EventArgs e)
{
    Console.WriteLine("ButtonClicked1");
}

当您单击该按钮时,这两个函数都将被调用。在您希望以编程方式为表单中的函数触发事件处理程序的情况下(例如,当用户在文本字段中按下回车键时,然后调用InvokeOnClick通过控件传递的方法。例如

this.InvokeOnClick(myButton, EventArgs.Empty);

this您所在的 Form 实例在哪里。

于 2020-09-01T18:48:48.537 回答
-3

使用 for 循环调用 button_click 事件

private void btnadd_Click(object sender, RoutedEventArgs e)
{ 
    for (int i = 0; i <= 2; i++)
        StuffThatHappensOnButtonClick(); 
}


void StuffThatHappensOnButtonClick()
{
    ........do stuff
}

我们假设您至少需要点击一次按钮

于 2014-07-22T14:55:26.863 回答