Как запретить System.Windows.Forms.NumericUpDown разрешать вводить нецифровые символы, когда DecimalPlaces = 0? - PullRequest
0 голосов
/ 04 декабря 2010

Я хочу, чтобы этот WinForm элемент управления (NumericUpDown) принудительно использовал целые числа в зависимости от типа (целое или плавающее) объекта, с которым я работаю.

Если я установлю DecimalPlaces = 0, он отображает 0, а затем увеличивает / уменьшает его на 1 при нажатии вверх / вниз. Однако, если я введу 0.6, он будет отображаться как 1, но останется как 0.6. Если я впоследствии увеличу его, базовое, но не отображаемое значение будет равно 1.6.

Я ищу простой идиоматический способ добиться того, что я хочу (надеюсь, понятно, чего я хочу). Если мне придется перехватить какое-то событие, я это сделаю, но я надеюсь просто положиться на какой-нибудь флаг / настройку, которую уже предоставляет класс NumericUpDown.

Если ваше решение подразумевает подкласс NumericUpDown, тогда мне придется подумать об этом. На этом этапе релиза я бы предпочел хорошо документированный хак чистому изменению, которое может вызвать ошибки в другом месте. Я хотел бы иметь возможность не подклассифицировать NumericUpDown.

Дайте мне знать, если у вас есть вопросы, спасибо.

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Базовое значение имеет тип decimal. DecimalPlaces влияет только на количество цифр, отображаемых в элементе управления. Самый простой способ достичь желаемого - округлить NumericUpDown.Value до целого.

0 голосов
/ 13 октября 2015

Вот несовершенное решение, которое мы используем. Во-первых, запретите пользователю вводить десятичную дробь (все остальное, что может набрать пользователь, кажется, прекрасно обрабатывается самим элементом управления):

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

Это не идеальное решение, но оно достаточно близко к предполагаемому поведению для наших нужд.

...