0

我希望根据我正在使用的事物的类型WinFormNumericUpDown整体与浮动)有条件地强制执行整数。

如果我设置DecimalPlaces = 0,它会显示 0,然后在我单击向上/向下时将其递增/递减 1。但是,如果我输入0.6,那么它将显示为 1,但将保持为0.6。如果我随后增加它,基础但未显示的值将是 1.6。

我正在寻找一种简单、惯用的方式来执行我想要的(希望很清楚我想要什么)。如果我必须拦截某种事件,那么我会,但我希望只依赖NumericUpDown该类已经提供的一些标志/设置。

如果您的解决方案涉及 sub-classing NumericUpDown,那么我将不得不考虑这一点。在发布的这个阶段,我更喜欢有据可查的黑客攻击,而不是可能导致其他地方出现错误的干净更改。我想选择不将NumericUpDown.

如果您有任何问题,请告诉我,谢谢。

4

2 回答 2

1

基础价值是十进制类型。DecimalPlaces 仅影响控件中显示的位数。实现您想要的最简单的方法是将 NumericUpDown.Value 舍入为 int。

于 2010-12-03T22:51:14.813 回答
0

这是我们正在使用的一个不完美的解决方案。首先,防止用户输入小数(用户可能输入的所有其他内容似乎都由控件本身处理得很好):

Private Sub HandleKeyPress(sender As Object, e As Windows.Forms.KeyPressEventArgs) Handles MyNumericUpDown.KeyPress
   If e.KeyChar = "."c Then e.Handled = True
End Sub

其次,防止用户粘贴数字以外的任何内容。请注意,我采用的方法对几个特定的​​组合键(ctrl-v 和 shift-insert)进行了硬编码。它不处理用户可能粘贴的其他方式,例如使用上下控件的上下文菜单。

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, 
                                           ByVal keyData As System.Windows.Forms.Keys) As Boolean
  If keyData = (Keys.Shift Or Keys.Insert) OrElse keyData = (Keys.Control Or Keys.V) Then
     Dim data As IDataObject = Clipboard.GetDataObject
     If data Is Nothing Then
        Return MyBase.ProcessCmdKey(msg, keyData)
     Else
        Dim text As String = CStr(data.GetData(DataFormats.StringFormat, True))
        If text = String.Empty Then
           Return MyBase.ProcessCmdKey(msg, keyData)
        Else
           For Each ch As Char In text
              If Not Char.IsNumber(ch) Then
                 Return True
              End If
           Next
           Return MyBase.ProcessCmdKey(msg, keyData)
        End If
     End If
  Else
     Return MyBase.ProcessCmdKey(msg, keyData)
  End If
End Function

这不是完美的解决方案,但它足够接近我们需要的预期行为。

于 2015-10-12T23:20:02.540 回答