Winforms 如何使用NumericUpDown控件防止键输入?

Winforms 如何使用NumericUpDown控件防止键输入?,winforms,delphi-prism,numericupdown,oxygene,Winforms,Delphi Prism,Numericupdown,Oxygene,我在winform上有一个numericupdown控件,我在测试时注意到,不仅可以通过按向上键和向下键来更改值,还可以从键盘输入值 我不想那样。我只希望用户能够通过单击框中的向上和向下按钮来更改numericupdown的值 到目前为止,我根本找不到解决办法 有人知道如何做到这一点吗?根据您允许的值范围,这听起来不利于用户体验 为此,您需要创建一个继承自NumericUpDown的控件,并重写OnKeyPress/OnKeyDown方法。根据您允许的值范围,这听起来不利于用户体验 要执行此操作

我在winform上有一个numericupdown控件,我在测试时注意到,不仅可以通过按向上键和向下键来更改值,还可以从键盘输入值

我不想那样。我只希望用户能够通过单击框中的向上和向下按钮来更改numericupdown的值

到目前为止,我根本找不到解决办法


有人知道如何做到这一点吗?

根据您允许的值范围,这听起来不利于用户体验


为此,您需要创建一个继承自NumericUpDown的控件,并重写OnKeyPress/OnKeyDown方法。

根据您允许的值范围,这听起来不利于用户体验


要执行此操作,您需要使用inherits from NumericUpDown创建一个控件,并重写OnKeyPress/OnKeyDown方法。

要禁用用户编辑,请将Readonly属性设置为true

updown.ReadOnly = true;

有关更多裁剪,请参阅此项。

若要禁用用户编辑,请将Readonly属性设置为true

updown.ReadOnly = true;

有关更多裁剪,您可以使用
updown.ReadOnly=True对我不起作用。这似乎是一个反复出现的错误。
但是捕获任何更改,然后撤消它。为此,将函数
updown\u ValueChanged()
绑定到
updown.ValueChanged
属性

    decimal spin = 1;
    private void updown_ValueChanged(object sender, EventArgs e)
    {
        if (updown.ReadOnly)
        {
            if (updown.Value != spin)
            {
                updown.Value = spin;
            }
        }
        else spin = updown.Value;
    }

使用
updown.ReadOnly=True对我不起作用。这似乎是一个反复出现的错误。
但是捕获任何更改,然后撤消它。为此,将函数
updown\u ValueChanged()
绑定到
updown.ValueChanged
属性

    decimal spin = 1;
    private void updown_ValueChanged(object sender, EventArgs e)
    {
        if (updown.ReadOnly)
        {
            if (updown.Value != spin)
            {
                updown.Value = spin;
            }
        }
        else spin = updown.Value;
    }

杰米,听起来确实很糟糕。我遇到的真正问题是每次更改numericupdown值时都需要触发valuechanged事件,但事实并非如此。它仅在使用“向上”和“向下”按钮时激发,而不是在使用键盘更改其值时激发。这就是为什么我在寻找一种方法来确保valuechanged事件在每次更改其值时都会激发。据我所知,valuechanged事件在控件失去焦点时激发?这还不够吗?嗯,我刚刚测试了控件,它的工作原理与您描述的完全相同,这是不够的。根据您告诉我的,用户必须单击其他控件或winform本身,才能使numericupdown控件失去焦点。因此,valuechanged事件可以触发。如果他们只想更改winform上单个numericupdown控件的值,然后单击OK按钮关闭winform,该怎么办。另外,OK按钮被禁用,并且只有在valuechanged事件触发时才会启用。您可以从控件继承并触发
ValueChanged
事件,然后在任何OnKeyPress/OnKeyDown/OnKeyUp方法中设置值?Jamie,这是真的,但我正在寻找一个简单的解决方案,它不需要我编写额外的代码。Jamie,听起来确实很糟糕。我遇到的真正问题是每次更改numericupdown值时都需要触发valuechanged事件,但事实并非如此。它仅在使用“向上”和“向下”按钮时激发,而不是在使用键盘更改其值时激发。这就是为什么我在寻找一种方法来确保valuechanged事件在每次更改其值时都会激发。据我所知,valuechanged事件在控件失去焦点时激发?这还不够吗?嗯,我刚刚测试了控件,它的工作原理与您描述的完全相同,这是不够的。根据您告诉我的,用户必须单击其他控件或winform本身,才能使numericupdown控件失去焦点。因此,valuechanged事件可以触发。如果他们只想更改winform上单个numericupdown控件的值,然后单击OK按钮关闭winform,该怎么办。另外,OK按钮被禁用,并且只有在valuechanged事件触发时才会启用。您可以从控件继承并触发
ValueChanged
事件,并在任何OnKeyPress/OnKeyDown/OnKeyUp方法中设置值?Jamie,这是真的,但我正在寻找一个简单的解决方案,它不需要我编写额外的代码。