WinForms:如何以程序方式触发事件处理程序? [英] WinForms: How to programatically fire an event handler?

查看:133
本文介绍了WinForms:如何以程序方式触发事件处理程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想以编程方式调用控件的事件处理程序。例如:

i want to programatically invoke an event handler for a control. For example:

DateTimePicker dtpLastConsummated;

我想触发 dtpLastConsummated ,我该怎么办?

i want to trigger the TextChanged event handler for the dtpLastConsummated, how can i do it?

在其他语言中,我会打电话给:

In other languages i would call something akin to:

dtpLastConsummated.TextChanged(this, new EventArgs());

但在.NET中,您可以有多个事件处理程序:

but in .NET you can have multiple event handlers:

dtpLastConsummated.Click +=new EventHandler(dtpLastConsummated_TextChanged);
dtpLastConsummated.Click +=new EventHandler(dtpLastConsummated_AnotherHandler);
dtpLastConsummated.Click +=new EventHandler(dtpLastConsummated_MoreHandlers);
...
dtpLastConsummated.Click +=new EventHandler(dtpLastConsummated_Nminus1);

所以你需要一种方法来触发所有附加的事件处理程序。

so you need a way to trigger all the attached event handlers.

以下代码将触发事件:

Toolkit.FireEvent(dtpLastConsummated, "TextChanged", new EventArgs());

这里是静态工具包函数的代码:

And here's the code of the static toolkit function:

/// <summary>
/// Programatically fire an event handler of an object
/// </summary>
/// <param name="targetObject"></param>
/// <param name="eventName"></param>
/// <param name="e"></param>
public static void FireEvent(Object targetObject, string eventName, EventArgs e)
{
   /*
    * By convention event handlers are internally called by a protected
    * method called OnEventName
    * e.g.
    *     public event TextChanged
    * is triggered by
    *     protected void OnTextChanged
    * 
    * If the object didn't create an OnXxxx protected method,
    * then you're screwed. But your alternative was over override
    * the method and call it - so you'd be screwed the other way too.
    */

   //Event thrower method name //e.g. OnTextChanged
   String methodName = "On" + eventName;

   MethodInfo mi = targetObject.GetType().GetMethod(
         methodName, 
         BindingFlags.Instance | BindingFlags.NonPublic);

   if (mi == null)
      throw new ArgumentException("Cannot find event thrower named "+methodName);

   mi.Invoke(targetObject, new object[] { e });
}






注意: 我不是在.NET框架和每个第三方控件中创建每个控件的子类,并且说服一个企业值得开发人员改造每个窗体以使用我的自定义控件。


Note: i'm not creating a subclass of every control in the .NET framework, and every 3rd party control, and convincing an enterprise worth of developers to retrofit every form to use my custom controls.

推荐答案

3建议启动TextChanged事件:

3 suggestions to fire the TextChanged Event:

手动更改文本:

        string s = dateTimePicker1.Text;
        dateTimePicker1.Text = String.Empty;
        dateTimePicker1.Text = s;

从DateTimePicker继承并创建一个暴露/调用DateTimePicker保护OnTextChanged的新方法

Inherit from DateTimePicker and create a new method that exposes / calls DateTimePicker's protected OnTextChanged

public class MyDateTimePicker : DateTimePicker
{
    public void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
    }
}

如果您不喜欢OOP并想要打破封装,可以通过反射访问受保护的OnTextChanged方法:

If you don't like OOP and want to break encapsulation, you can access the protected OnTextChanged method through reflection:

        MethodInfo onTextChanged = dateTimePicker1.GetType().GetMethod("OnTextChanged", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        onTextChanged.Invoke(dateTimePicker1, new object[] { new EventArgs() });

这篇关于WinForms:如何以程序方式触发事件处理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆