Controls personalisé textbox

Contenu du snippet

En ayant marre à chaque dois de devoir gérer l'événement KeyPress pour empêcher un certain type de saisie. Je me suis décidé d'hériter un control TextBox qui surcharge cet événement.

J'en ai donc profité pour en faire un petit exemple ou cas d'école.

Notion abordé :
- Héritage
- Surcharge
- divers

Source / Exemple :


Public Class xTextBox
    Inherits System.Windows.Forms.TextBox

#Region "Nested"

    ''' <summary>
    ''' Type de saisie demandé par la zone texte
    ''' </summary>
    ''' <remarks></remarks>
    Public Enum SaisieType
        ''' <summary>
        ''' Ne permet qu'uniquement la saisie de Nombre
        ''' </summary>
        ''' <remarks></remarks>
        Chiffre
        ''' <summary>
        ''' Ne permet qu'uniquement la saisie de nombre et des symbole monaitaire tel que spécifie pour la culture
        ''' </summary>
        ''' <remarks></remarks>
        Numerique
        ''' <summary>
        ''' Permet toute saisie
        ''' </summary>
        ''' <remarks></remarks>
        AlphaNumerique
        ''' <summary>
        ''' Ne permet qu'uniquement de la saisie de caractère aplhabétique
        ''' </summary>
        ''' <remarks></remarks>
        Alpha

    End Enum

#End Region

#Region "Membre"

    Private _typSaisie As SaisieType
    Private _oValue As Object

#End Region

#Region "Propriété"

    ''' <summary>
    ''' Obtient ou défini le type de saisi souhaité par le clavier
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property TypeDeSaisie() As SaisieType
        Get
            Return Me._typSaisie
        End Get
        Set(ByVal value As SaisieType)
            Me._typSaisie = value
        End Set
    End Property

    ''' <summary>
    ''' Obtient ou défini l'objet de "Value". Attention, l'affectation d'un type utilisera la méthode ToString() par défaut l'objet
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Value() As Object
        Get
            Return Me._oValue
        End Get
        Set(ByVal value As Object)
            If value Is Nothing Then
                value = ""
            End If
            MyBase.Text = value.ToString()
            Me._oValue = value
        End Set
    End Property

    ''' <summary>
    ''' Retourne le type de l'objet contenue dans la propriété "Value"
    ''' </summary>
    ''' <value></value>
    ''' <returns>System.Type</returns>
    ''' <remarks></remarks>
    Public ReadOnly Property TypeValue() As Type
        Get
            Return Me._oValue.GetType()
        End Get

    End Property

    ''' <summary>
    ''' Permet l'affactation direct d'une valeur provenant d'un champs base. Si la valeur est Null ou Nothing. Une valeur par défaut est affecté en fonction de type de saisie choisie
    ''' </summary>
    ''' <value></value>
    ''' <remarks></remarks>
    Public WriteOnly Property DbNullText() As Object
        Set(ByVal value As Object)

            Me._oValue = value

            If value Is Nothing OrElse value.GetType() Is GetType(DBNull) Then

                Select Case Me._typSaisie
                    Case SaisieType.Alpha
                        MyBase.Text = ""
                    Case SaisieType.AlphaNumerique
                        MyBase.Text = ""
                    Case SaisieType.Chiffre
                        MyBase.Text = "0"
                    Case SaisieType.Numerique
                        MyBase.Text = String.Concat("0", My.Application.Culture.NumberFormat.CurrencyDecimalSeparator, "0")
                End Select

            Else

                MyBase.Text = value.ToString()

            End If

            

        End Set
    End Property

#End Region

#Region "Surcharge"
    Private Const _intMsgProc As Integer = &H302
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        Dim blnMessageAutoriser As Boolean = False

        If m.Msg <> _intMsgProc Then
            MyBase.WndProc(m)
        Else

            If Clipboard.ContainsText Then
                
                blnMessageAutoriser = VerifieSaisieString(Clipboard.ContainsText())

                If blnMessageAutoriser Then

                    MyBase.WndProc(m)

                End If

            End If
        End If

    End Sub

    Protected Overrides Sub OnDragEnter(ByVal drgevent As System.Windows.Forms.DragEventArgs)
        MyBase.OnDragEnter(drgevent)

        Dim strTampon As String = ""

        If drgevent.Data IsNot Nothing Then

            strTampon = drgevent.Data.GetData(strTampon.GetType())

            If Not VerifieSaisieString(strTampon) Then

                drgevent.Data.SetData("")

            End If

        End If

    End Sub

    Private Function VerifieSaisieString(ByVal p_strTextAVerifier As String) As Boolean

        Dim blnRetour As Boolean

        For Each chrItem As Char In p_strTextAVerifier

            Select Case Me._typSaisie
                Case SaisieType.Alpha
                    blnRetour = VerifSaisieAlpha(chrItem)
                Case SaisieType.AlphaNumerique
                    blnRetour = True
                Case SaisieType.Chiffre
                    blnRetour = VerifSaisieChiffre(chrItem)
                Case SaisieType.Numerique
                    blnRetour = VerifSaisieNumerique(chrItem)
            End Select

            If Not blnRetour Then
                Exit For
            End If

        Next

        Return blnRetour

    End Function

    ''' <summary>
    ''' Surcharge l'événement KeyPress de la TextBox pour filtrer sur le type de saisie
    ''' </summary>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
        MyBase.OnKeyPress(e)

        If Not e.Handled Then

            If Not Char.IsControl(e.KeyChar) Then

                Select Case Me._typSaisie
                    Case SaisieType.Alpha
                        e.Handled = VerifSaisieAlpha(e.KeyChar)
                    Case SaisieType.AlphaNumerique
                        e.Handled = False
                    Case SaisieType.Chiffre
                        e.Handled = VerifSaisieChiffre(e.KeyChar)
                    Case SaisieType.Numerique
                        e.Handled = VerifSaisieNumerique(e.KeyChar)
                End Select
            End If
        End If
    End Sub

    ''' <summary>
    ''' Obtient ou défini la valeur de la propriété Text du textebox de base.
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>Attention, sur l'affectation de cette propriété aucun control de saisie n'est effectué pour laisser toute liberter à l'affectation par programmation</remarks>
    Public Overrides Property Text() As String
        Get
            Return MyBase.Text
        End Get
        Set(ByVal value As String)
            MyBase.Text = value
            ' affectation sur le membre value pour conservé la cohérence
            Me._oValue = value
        End Set
    End Property

#End Region

#Region "Méthode privée"

    Private Function VerifSaisieNumerique(ByVal p_oChr As Char) As Boolean

        Dim blnretour As Boolean

        ' recherche le type de séparateur décimal utilisé par Application
        If My.Application.Culture.NumberFormat.CurrencyDecimalSeparator = p_oChr.ToString() Then
            blnretour = False
        Else
            blnretour = Not IsNumeric(p_oChr)
        End If

        Return blnretour

    End Function
    Private Function VerifSaisieChiffre(ByVal p_oChr As Char) As Boolean

        Dim blnretour As Boolean

        blnretour = Not Char.IsNumber(p_oChr)

        Return blnretour

    End Function
    Private Function VerifSaisieAlphaNumerique(ByVal p_oChr As Char) As Boolean

        ' ce traitement n'a pas d'intérêt si ce n'est que de laisser une porte ouverte pour un traitement spécifique
        Dim blnretour As Boolean
        blnretour = True
        Return blnretour

    End Function
    Private Function VerifSaisieAlpha(ByVal p_oChr As Char) As Boolean

        Dim blnretour As Boolean

        blnretour = Char.IsNumber(p_oChr)

        Return blnretour

    End Function

#End Region

End Class

Conclusion :


Bien sur ce source n'est pas un parfait control hérité puisqu'il manque les attributs pour le "property designer" ainsi que d'autre détails propre à la création de control.

Mais je pense que cela peut être un bon point de départ sur les notions abordés

A voir également