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

Posted

技术标签:

【中文标题】以编程方式触发控件的事件【英文标题】:Trigger control's event programmatically 【发布时间】:2012-08-24 10:58:59 【问题描述】:

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

问题是:是否可以通过代码触发ButtonClicked事件而不用真正点击?

【问题讨论】:

因为这个问题仍然存在(我什至得到了一些声誉:)),我想在这里放一个小警告:如果你认为你需要在你的代码中做这样的事情几乎可以肯定你做错了什么。我也是。你可能有一些糟糕的设计,你最好花一些时间,重新考虑你在做什么以及为什么。 我实际上认为这是一个相关的问题,我想创建一个弹出菜单,它通常包括工具栏中的所有项目以及上下文菜单已有的内容,itsme86 提到的 PerformClick 方法帮助:- ) 响应警告,这实际上与UI测试非常相关。您经常需要“触发一次点击”而不点击进行自动化测试。 【参考方案1】:

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

button1.PerformClick();

【讨论】:

通常,您只需手动调用事件处理程序。例如:button1_Shown(button1, EventArgs.Empty);【参考方案2】:

.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);
    


【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

    private void btnTriggerHello_Click(object sender, EventArgs e)
    
        btnSayHello_Click(null, null);
    

【讨论】:

我不需要调用 handlers 方法。我需要触发事件。触发事件后调用Handler。【参考方案5】:
button1.PerformClick();

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

【讨论】:

【参考方案6】:

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

void Event_Method()

    //Put Event code here.
    MessageBox.Show("Hello!");


void _btnSend_Click(object sender, EventArgs e)

    Event_Method();


void AnotherMethod()

    Event_Method();

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

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

【讨论】:

【参考方案7】:

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

过度考虑你的方法。

【讨论】:

【参考方案8】:

我最近遇到了这个问题,我想以编程方式单击一个分配了多个事件处理程序的按钮(想想 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 实例。

【讨论】:

【参考方案9】:

使用 for 循环调用 button_click 事件

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



void StuffThatHappensOnButtonClick()

    ........do stuff

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

【讨论】:

来吧伙计!这到底和这个问题有什么关系?

以上是关于以编程方式触发控件的事件的主要内容,如果未能解决你的问题,请参考以下文章

当输入的值以编程方式更改时触发更改事件

使用 jQuery 在 IE 的 Javascript 中以编程方式触发事件

以编程方式触发 iOS 抖动事件

如何以编程方式在 ExtJS 4 中触发 keydown 事件

以编程方式在 linux 上触发 inotify 事件

以编程方式触发 jsdom 窗口中的滚动或按键事件