numericUpDown1 值超过最大范围后返回的值 (C# Windows 窗体)

Value returned after numericUpDown1 value exceeds the maximum range (C# Windows Form)

提问人:Ricardo 提问时间:11/9/2023 更新时间:11/9/2023 访问量:42

问:

我为我的“numericUpDown1”设置了最小值 1 和最大值 10。(C# Windows 窗体)

当我从键盘手动输入值 0 时,“numericUpDown1”会自动增加到 1,当我从键盘手动输入大于 10 的值时,“numericUpDown1”会自动减少到 10。

我可以更改这些自动退货吗?例如:如果我键入 25,它将返回 3 而不是 10。

是否有任何选项/属性可以更改此设置?

我尝试了一些选项,例如“已验证”、“正在验证”、“离开”和“ValueChanged”。但这没有用。

当它为 <=0 或 >10 时,我想返回一个错误 (messagebox) 并自动将“numericUpDown1”的值返回为 1。

C# WinForms 验证 运行时错误 NumericUpdown

评论

2赞 Steve 11/9/2023
不知道如何回答这个问题。但是,如果您想验证自己的数字,请不要指定最小值/最大值!

答:

1赞 IVSoftware 11/9/2023 #1

一种方法是处理事件。我个人使用的方法是继承它的实例,并将其在 MainForm.Designer.cs 文件中替换为我的自定义类。现在,如果在设计器中将值设置为 10,它将按照您描述的方式运行。KeyDownNumericUpDownMaximum

screenshot


class NumericUpDownEx : NumericUpDown
{
    // Disable range checking in the base class.
    public NumericUpDownEx()
    {
        base.Maximum = decimal.MaxValue;
        base.Minimum = decimal.MinValue;
    }
    public new decimal Maximum { get; set; } = 100; // Keep default value the same
    public new decimal Minimum { get; set; } = 0;   // Keep default value the same

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        switch (e.KeyData)
        {
            case Keys.Enter:
                e.Handled = e.SuppressKeyPress = true;
                BeginInvoke((MethodInvoker)delegate
                {
                    // In this case, Designer has set Min = 1, Max = 10
                    if (Value < Minimum || Value > Maximum)
                    {
                        var message = $"Error: '{Value}' is not legal.";
                        Value = 1;
                        MessageBox.Show(message);
                        Focus();
                    }
                    var length = Value.ToString().Length;
                    if (length > 0)
                    {
                        Select(0, length);
                    }
                });
                break;
        }
    }
    .
    .
    .
}

当控件失去焦点时,您还需要执行相同的操作。

    .
    .
    .
    /// <summary>
    ///  The Validating event doesn't always fire when we want it to,
    ///  especially if this is the only control. Do this instead;
    /// </summary>
    protected override void OnLostFocus(EventArgs e)
    {
        base.OnLostFocus(e); 
        OnKeyDown(new KeyEventArgs(Keys.Enter));
    }

评论

1赞 Ricardo 11/19/2023
效果很好,非常感谢!对于我来说,这是一个非常有用的基础,可以学习和了解一些默认设置是如何工作的,并且可以修改,例如键盘按下键、鼠标滚动、按住鼠标点击......