以编程方式触发控件的事件

ste*_*avy 29 c# events controls winforms

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

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

its*_*e86 41

按钮控件具有可以调用的PerformClick()方法.

button1.PerformClick();
Run Code Online (Sandbox Code Playgroud)

  • 通常,您只需手动调用事件处理程序即可.例如:button1_Shown(button1,EventArgs.Empty); (5认同)
  • 这对于点击很有用,但如果我需要另一个活动怎么办? (3认同)

Tom*_*Bot 22

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

class MyButton : System.Windows.Forms.Button
{

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

}
Run Code Online (Sandbox Code Playgroud)


Cᴏʀ*_*ᴏʀʏ 15

您可以直接调用事件处理函数并指定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);
Run Code Online (Sandbox Code Playgroud)

或者,您可以将逻辑从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();
Run Code Online (Sandbox Code Playgroud)

后一种方法的优点是可以将业务和UI逻辑分开.你真的不应该在你的控件事件处理程序中有任何业务逻辑.


Tar*_*zan 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);
    }
Run Code Online (Sandbox Code Playgroud)

  • 我不需要调用处理程序方法.我需要触发事件.触发事件后调用处理程序. (2认同)