Ir para o conteúdo

ReadOnly NumericUpDown

Controlo NumericUpDown, na propriedade ReadOnly, não tem um comportamento perfeito no seu funcionamento, pois embora esteja definido como ReadOnly, é possível alterar os números através das setas (Up e Down).

Uma das formas de resolver este problema é criar um novo controlo, que herda o controlo base, e que faz o override ao UpButton e DownButton de modo a ignorar as setas, caso a propriedade ReadOnly esteja definida.

Como a definição desta propriedade altera também a cor de fundo (BackColor), foi criada uma shadow property para não fazer esta alteração e podes personalizar o controlo a gosto.

O resultado é esta classe que após compilada ficará disponível na Toolbox.

Exemplo

Class ReadOnlyNumericUpDown
    Inherits NumericUpDown

    Private m_ReadOnly As Boolean


    ''' <summary>
    ''' Cria uma propriedade para definir o NumericUpDown como ReadOnly
    ''' e como já existe uma propriedade com este nome é necessário criar
    ''' uma Shadows Property. Além disso como é uma palavra reservada tem
    ''' de ser colocada entre chavetas rectas []
    ''' </summary>
    Public Shadows Property [ReadOnly]() As Boolean
        Get
            Return m_ReadOnly
        End Get
        Set(ByVal value As Boolean)
            m_ReadOnly = value
        End Set
    End Property


    ''' <summary>
    ''' Ao ser carregado no botão para cima e se for ReadOnly ignora a acção
    ''' </summary>
    ''' <remarks></remarks>
    Public Overrides Sub UpButton()
        If Not Me.ReadOnly Then
            MyBase.UpButton()
        End If
    End Sub



    ''' <summary>
    ''' Ao ser carregado no botão para baixo e se for ReadOnly ignora a acção
    ''' </summary>
    ''' <remarks></remarks>
    Public Overrides Sub DownButton()
        If Not Me.ReadOnly Then
            MyBase.DownButton()
        End If
    End Sub


    ''' <summary>
    ''' Ao ser pressionada uma tecla e se for ReadOnly ignora a acção
    ''' </summary>
    ''' <remarks></remarks>
    Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
        If Not Me.ReadOnly Then
            MyBase.OnKeyDown(e)
        Else
            e.SuppressKeyPress = True
        End If
    End Sub

End Class