これが私たちが使用している不完全な解決策です。まず、ユーザーが小数を入力できないようにします(ユーザーが入力する可能性のある他のすべては、コントロール自体によって正常に処理されるようです)。
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
これは完璧な解決策ではありませんが、私たちのニーズに対して意図された動作に十分に近いものです。