Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不引发ValueChanged事件的情况下更新NumericUpDown控件的值(Winforms)_C#_Winforms - Fatal编程技术网

C# 在不引发ValueChanged事件的情况下更新NumericUpDown控件的值(Winforms)

C# 在不引发ValueChanged事件的情况下更新NumericUpDown控件的值(Winforms),c#,winforms,C#,Winforms,我需要在不引发ValueChanged事件(WinForms,C#)的情况下更新NumericUpDown控件的值。 简单的方法是删除事件处理程序,如: numericUpDown.ValueChanged -= numericUpDown_ValueChanged; 然后设置所需的值: numericUpDown.Value = 15; 要再次添加事件处理程序,请执行以下操作: numericUpDown.ValueChanged += numericUpDown_ValueChanged

我需要在不引发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);
}
private void numericUpDownsetValuewithout-ValueChangedEvent(NumericUpDown控件,十进制值)
{
EventHandlerList events=(EventHandlerList)typeof(Component).GetField(“事件”,BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField).GetValue(控件);
object current=events.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField)[0].GetValue(事件);
列表委托=新列表();
while(当前!=null)
{
Add((Delegate)GetField(当前,“处理程序”);
当前=获取字段(当前,“下一步”);
}
foreach(代理中的代理d)
{
Debug.WriteLine(d.ToString());
}
}
公共静态对象GetField(对象列表项,字符串字段名)
{
返回listItem.GetType().GetField(fieldName,BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField).GetValue(listItem);
}

运行NumericUpDownSetValueWithoutValueChangedEvent函数后,
当前对象
等于null,因此没有找到任何事件处理程序(我在表单上尝试了它-找到了所有事件处理程序)

您是否尝试过仅更改内部值并更新文本?这样,您就可以绕过正在激发的eventhandler

如果你看一下源代码() 您将看到属性值正在使用一个名为
currentValue
的私有字段。这是您要设置的值。然后只需执行
control.Text=value.ToString()

范例

private void SetNumericUpDownValue(NumericUpDown control, decimal value)
{
    if (control == null) throw new ArgumentNullException(nameof(control));
    var currentValueField = control.GetType().GetField("currentValue", BindingFlags.Instance | BindingFlags.NonPublic);
    if (currentValueField != null)
    {
        currentValueField.SetValue(control, value);
        control.Text = value.ToString();
    }
}
这还没有经过测试,但我很确定它会起作用。:)
快乐编码

您是否尝试过仅更改内部值并更新文本?这样,您就可以绕过正在激发的eventhandler

如果你看一下源代码() 您将看到属性值正在使用一个名为
currentValue
的私有字段。这是您要设置的值。然后只需执行
control.Text=value.ToString()

范例

private void SetNumericUpDownValue(NumericUpDown control, decimal value)
{
    if (control == null) throw new ArgumentNullException(nameof(control));
    var currentValueField = control.GetType().GetField("currentValue", BindingFlags.Instance | BindingFlags.NonPublic);
    if (currentValueField != null)
    {
        currentValueField.SetValue(control, value);
        control.Text = value.ToString();
    }
}
这还没有经过测试,但我很确定它会起作用。:)
快乐编码

在这种情况下,
currentValueField
为空。哈哈哈,我的错!:)我需要修改代码,正如我不小心写的:“this.GetType()…”请再试一次;)将
this.GetType()
替换为
control.GetType()
。在这种情况下,
currentValueField
为null。哈哈哈,我的错!:)我需要修改代码,正如我不小心写的:“this.GetType()…”请再试一次;)用
control.GetType()
替换
this.GetType()
,我很确定它不是。你能解释一下我错过了什么吗?我很确定不是。你能解释一下我错过了什么吗?