Controls personalisé textbox

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 354 fois - Téléchargée 17 fois

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

Ajouter un commentaire

Commentaires

cs_Warny
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015
-
Salut,
Il faut également gérer le copier-coller et le glisser-déplacer pour éviter qu'un utilisateur n'utilise ces moyens détournés pour saisir une valeur.
Sinon, excelente idée.
cs_rodcobalt22
Messages postés
195
Date d'inscription
dimanche 10 février 2002
Statut
Membre
Dernière intervention
16 février 2016
-
Effectivement, c'est une piste d'amélioration ^^

C'était surtout pour montrer le principe d'héritage et surcharge sur un exemple concret.
Mais je pense qu'effectivement, je vais gérer les copier/coller

Merci de ta remarque

Rod^^
Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1 -
MyBase.Text = String.Concat("0", My.Application.Culture.NumberFormat.CurrencyDecimalSeparator, "0")
1) mybase ou me ?
2) plus simple que ce j'utilise à ce jour, merci du tuyaux ;)

Manque en effet le choix des couleurs et autres mais bon c'est pas ça le plus dur ^^

initié ? mouais si je comprend le code c'est que c'est plus débutant lol

8/10 car bien écrit, propre et simple à comprendre pour un tuto.
Merci à toi.
cs_rodcobalt22
Messages postés
195
Date d'inscription
dimanche 10 février 2002
Statut
Membre
Dernière intervention
16 février 2016
-
Salut merci beaucoup.
Comme je le rappel, le but n'est pas de faire un control entier. Après le choix des couleurs, il reste les choix natifs proposés par le TextBox.

MyBase est mieux que Me dans ce cas. Vue que le control est hérité; il vaut alimenté les valeurs du type primaire pour ne pas interférer avec le type enfant.

Pour initié quand même (hourrah pour toi !! lol) car il faut un minimum de connaissance objet (Principe d'héritage et surcharge).
Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1 -
bon si tu le dis, allons y pour l'initié ^^

pour le mybase, et si j'ai deux xtextbox avec des valeurs différentes ? vaut pas mieux un me ?
@ te lire ++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.