【问题标题】:C# winforms numericupdown controlC# winforms numericupdown 控件
【发布时间】:2017-01-06 04:36:49
【问题描述】:

我正在使用 numericupdown 控件。当以编程方式分配值或用户更改值时,会触发 ValueChanged 事件。

我希望仅在用户更改值时触发事件,而不是在我设置最小值和最大值时触发。怎么办?

【问题讨论】:

    标签: c#


    【解决方案1】:

    以 TheVillageIdiot 的回答为基础...您可以创建一个可重用的子类,例如:

    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)更新。好奇心:如果您愿意添加 cmets,说明您为什么将课程密封,以及为什么使用 try/catch 块,那将不胜感激。谢谢!
    • 我有默认密封的习惯。在这种情况下,这无关紧要。至于 try/finally - 这是另一个习惯,以避免出现异常退出方法而将抑制设置为 true 的情况。虽然在这种情况下我不知道是否可能出现异常,但确保将标志设置回原来的状态始终是一种好习惯。
    • +1 感谢您的回复,乔希。我花了不到五分钟的时间来实现一个“递归证明”派生的 TreeView 和 ListView,递归由每个公共属性控制,并验证它们按预期工作:一个缺点:你必须修改 Designer.cs 文件,或者自己鞭打它们,自己设置无数属性,或者至少使用默认控件进行设计,然后从 Designer.cs 类中提取设置并将它们“移植”到其他地方,然后进入并将声明切换为您的派生类型。我通常反对接近 Designer.cs 文件。
    【解决方案2】:

    试试这样的:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多