【问题标题】:NumericUpDown Invalid valueNumericUpDown 无效值
【发布时间】:2013-12-12 18:34:02
【问题描述】:

我在 WinForms 中有一个应用程序,其中有许多控件。这些控件代表应用程序的设置,用户可以通过单击按钮来保存这些设置。

我正在尝试解决 NumericUpDown(我将其称为 Num)控件的问题:假设 Num 具有以下属性:

最少:10 最大:60 步骤:1

如果用户想要更改值,有两种方法可以做到这一点:单击箭头(Num 的右侧)或手动将值直接输入到 Num。第一种方式还可以,但大多数用户都在使用第二种方式,并且存在一些问题。

如果用户在区间外键入某个值,例如 1,则可以,因为他可以继续键入 5,因此最终值为 51,这在区间内。但是如果他在值 1 之后停止输入,这意味着他在区间 (1) 之外输入了值。如果他点击 Num 之外的某个地方,值(超出区间)会自动更改为最接近的允许值(如果为 1,则值将更改为 10)。

但他可能不会注意到这个自动更改,所以我想以某种方式处理它并通知他他在那里放置了无效值。但是这种情况不是由 Num 的任何事件处理的(没有办法找出他放在那里的这个无效值 - 如果我尝试在 ValueChanged 事件中读取值,它会读取自动更改的值,而不是无效值)。

我知道我可以添加TextChanged 事件,但是有一个问题,如果他输入了一些无效值(5),它可以更改为有效值(通过添加 1 得到 15)。

您对如何解决此问题有任何想法吗?我知道这很愚蠢,但这不取决于我,我必须这样做,我不知道该怎么做。

【问题讨论】:

    标签: vb.net winforms event-handling numericupdown


    【解决方案1】:

    使用 Lost Focus 而不是在设计阶段设置最小值,而是使用 If 语句检查它。

     Private Sub Num_LostFocus(sender As Object, e As System.EventArgs) Handles Num.LostFocus
         If Num.Value < 10 Then MsgBox("Number is incorrect")
     End Sub
    

    或者,您可以创建一个自定义控件,您可以在其中覆盖将值更改为最小值的事件,但我从未尝试过。

    【讨论】:

    • 但是如果用户想用箭头设置值怎么办?如果没有设置最小值和最大值,他可以通过此箭头轻松转到无效值...
    • 使用 Num.ValueChanged 将值保持在限制范围内。
    【解决方案2】:

    所以这是我的解决方案:

    我处理TextChanged 事件,并在这个方法中将text 分配给它的tag:

    Private Sub NUDTextChanged()
        Integer.TryParse(NUD.Text, NUD.Tag)
    End Sub
    

    然后:

    Private Sub NUD_LostFocus() Handles NUD.LostFocus
        If NUD.Tag < NUD.Minimum Or NUD.Tag > NUD.Maximum Then
            ' show message
        End If
    End Sub
    

    处理Validating 事件对我来说毫无用处,因为在验证之前自动更改为允许值,并且此自动更改会触发TextChange 事件,因此在验证后我有新值而不是无效值。

    LostFocus 在自动更改之前,因此我可以轻松控制该值是否有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多