【发布时间】:2016-08-21 11:25:27
【问题描述】:
我需要在不引发 ValueChanged 事件(WinForms、C#)的情况下更新 NumericUpDown 控件的值。
简单的方法是删除事件处理程序,例如:
numericUpDown.ValueChanged -= numericUpDown_ValueChanged;
然后设置所需的值:
numericUpDown.Value = 15;
并再次添加事件处理程序:
numericUpDown.ValueChanged += numericUpDown_ValueChanged;
问题是我想编写方法,将 NumericUpDown 控件作为第一个参数,所需的值作为第二个参数,并按照下面给出的方式更新值。
为此,我需要为 ValueChanged 事件找到已连接的事件处理程序(对于每个 NumericUpDown 它都不同)。
我搜索了很多,但没有找到适合我的解决方案。
我最后一次尝试是:
private void NumericUpDownSetValueWithoutValueChangedEvent(NumericUpDown control, decimal value)
{
EventHandlerList events = (EventHandlerList)typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField).GetValue(control);
object current = events.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField)[0].GetValue(events);
List<Delegate> delegates = new List<Delegate>();
while (current != null)
{
delegates.Add((Delegate)GetField(current, "handler"));
current = GetField(current, "next");
}
foreach (Delegate d in delegates)
{
Debug.WriteLine(d.ToString());
}
}
public static object GetField(object listItem, string fieldName)
{
return listItem.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField).GetValue(listItem);
}
NumericUpDownSetValueWithoutValueChangedEvent 函数运行后,object current 等于 null,因此没有找到任何 EventHandler(我在 Form 上尝试过 - 找到了所有事件处理程序)。
【问题讨论】:
-
我很确定不是。你能解释一下我错过了什么吗?