这是我们正在使用的一个不完美的解决方案。首先,防止用户输入小数(用户可能输入的所有其他内容似乎都由控件本身处理得很好):
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
这不是完美的解决方案,但它足够接近我们需要的预期行为。