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

时间:2012-08-29 18:50:12

标签: c# winforms events controls

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

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

9 个答案:

答案 0 :(得分:37)

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

button1.PerformClick();

答案 1 :(得分:22)

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

class MyButton : System.Windows.Forms.Button
{

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

}

答案 2 :(得分: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);

或者,您可以将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逻辑分开。你真的不应该在你的控制事件处理程序中有任何业务逻辑。

答案 3 :(得分: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);
    }

答案 4 :(得分:4)

button1.PerformClick();

但是如果你不得不做这样的事情,那么最好将你在活动中使用的代码移到新方法上?

答案 5 :(得分:3)

为什么不直接将事件代码放入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();
}

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

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

答案 6 :(得分:0)

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

仔细考虑您的方法。

答案 7 :(得分: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");
}

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

this.InvokeOnClick(myButton, EventArgs.Empty);

this是您所在的Form实例。

答案 8 :(得分:-2)

使用for循环调用button_click事件

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


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

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