C#winforms numericupdown控件

C#winforms numericupdown控件,c#,C#,我正在使用numericupdown控件。以编程方式指定值或用户更改值时,将触发ValueChanged事件 我希望事件仅在用户更改值时触发,而不是在我设置最小值和最大值时触发。如何做到这一点?试试这样的方法: var changeFromCode = false; void abc() { // This is where you change value in code. changeFromCode = true; ud1.Value = 15; changeFr

我正在使用numericupdown控件。以编程方式指定值或用户更改值时,将触发ValueChanged事件


我希望事件仅在用户更改值时触发,而不是在我设置最小值和最大值时触发。如何做到这一点?

试试这样的方法:

var changeFromCode = false;

void abc()
{
   // This is where you change value in code.
   changeFromCode = true;
   ud1.Value = 15;
   changeFromCode = false;
}

// Sorry, I am not sure about handler signatures
void UpDownValueChanged(object sender, EventArgs e)
{
   if (changeFromCode)
       return;
}

基于Villageidiot的答案。。。您可以创建一个可重用的子类,如:

public sealed class MyNumericUpDown : NumericUpDown {

    private bool suppress;

    protected override void OnValueChanged(EventArgs e) {
        if (!suppress) {
            base.OnValueChanged(e);
        }
    }

    public void SetRange(decimal min, decimal max) {
        suppress = true;
        try {
            Minimum = min;
            Maximum = max;
        }
        finally {
            suppress = false;
        }
    }

}

+1我喜欢您将解决方案移动到更高抽象级别的方式,我想我可能会在需要在两个(或更多)“同步”控件(如TreeView和Listview)更新时抑制递归的频繁情况下使用类似的策略。好奇:如果您想添加注释,说明为什么要密封该类,以及为什么要使用try/catch块,我们将不胜感激。谢谢我有一个习惯,默认情况下密封。在这种情况下,这并不重要。至于try/finally,另一个习惯是避免异常退出方法并将suppress设置为true。虽然在这种情况下,我不知道是否可能出现异常,但确保您将标志设置回原来的状态始终是一种良好的做法。+1谢谢您的回复,Josh。我花了不到五分钟的时间实现了一个“递归证明”派生的TreeView和ListView,每个TreeView和ListView中的递归都由一个公共属性控制,并验证它们是否按预期工作:一个缺点是:你必须修改Designer.cs文件,或者自己修改它们,自己设置无数属性,或者,至少使用默认控件进行设计,然后从Designer.cs类中删除设置并将其“移植”到其他地方,然后进入并将声明切换到派生类型。我通常反对接近Designer.cs文件。