我想以编程方式调用控件的事件处理程序。例如:
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:如何以程序方式触发事件处理程序?
发布评论