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