使用默认按钮的 NumericUpDown 自定义增量

NumericUpDown custom increment using default Buttons

我有一个增量为 5 的 NumericUpDown 控件。使用键盘输入 1 是可能的,而且应该始终是可能的。
但是,当我单击向上按钮时,我不想使用 6,而是使用 5,始终使用 51015...

这怎么可能?在 ValueChange 中这是不可能的,因为我希望能够通过键盘输入每个数字。

您可以使用 NumbericUpDown Click 事件。单击 up/down 个按钮时调用。

private void OnClick(object sender, EventArgs e)
{
    numericUpDown.Value -= numericUpDown.Value % 5;
}

编辑:由于单击文本字段时也会调用该事件,因此我提出了另一种解决方案。

您可以覆盖 NumericUpDown 方法 UpButton and DownButton 来触发事件。

public class MyNumericUpDown : System.Windows.Forms.NumericUpDown
{
    public event Action OnButtonPressed;
    
    public override void UpButton()
    {
        base.UpButton();
        OnButtonPressed?.Invoke();
    }

    public override void DownButton()
    {
        base.DownButton();
        OnButtonPressed?.Invoke();
    }
}

并在 YourForm.Designer.cs 中将 this.numericUpDown = new System.Windows.Forms.NumericUpDown(); 重写为 this.numericUpDown = new YourNamespace.MyNumericUpDown();

然后在您的表单构造器中添加:

numericUpDown.OnButtonPressed += () => numericUpDown.Value -= numericUpDown.Value % 5;

您可以从 NumericUpDown 派生自定义控件,覆盖两者 UpButton() and DownButton() 以提供自定义逻辑以应用于 Increment 值。

此处,将增量设置为 5、NumericUpDown 按钮(以及 UPDOWN 键,如果 InterceptArrowKeys 设置为 true),将增加或减少值 5
如果用户使用键盘输入不同的值,该值将被接受,除非它超过 MaximumMinimum 预设值。在这种情况下,控件将重置为 MaximumMinimum 值。

例如,用户输入 16:如果按下 UpButton,则值将设置为 20,如果 DownButton,则设置为 15 ] 被按下。
无论哪种情况,输入的值都不能超过上下限。

请注意,base.UpButton()base.DownButton() 均未被调用,因为它们会使用标准方法将值调整为增量集。

class NumericUpDpwnCustomIncrement : NumericUpDown
{
    public NumericUpDpwnCustomIncrement() { }

    public override void UpButton() => 
        Value = Math.Min(Value + (Increment - (Value % Increment)), Maximum);

    public override void DownButton() => 
        Value = Math.Max(Value - (Value % Increment == 0 ? Increment : Value % Increment), Minimum);

    protected override void OnValueChanged(EventArgs e)
    {
        base.OnValueChanged(e);
        Value = Math.Max(Math.Min(Value, Maximum), Minimum);
    }
}