Un des inconvenients des controles tout fait par microsoft est que, je trouve, ne posséde pas assez de fonctionnalité coté client.
Cette classe permet d'ajouter du code javascript associé aux evenements javascript du controle. Par exemple grace à cette class nous pouvons facilement ajouté du code javascript a l'evenement onclick du control bouton
pour ce faire il vous faut créer un nouveaubutton derivant de button
et ensuite dans la methode AddAttributesToRender faire comme cela :
Protected Overrides Sub AddAttributesToRender(ByVal writer As System.Web.UI.HtmlTextWriter)
MyBase.AddAttributesToRender(writer)
Dim isOnClickAttributsAdded As Boolean = False
Dim CodeJavascript As New Cyril.Controls.Utility.EcrireEvenementJavascript(writer, Me.UniqueID)
If Me.isOneClick = True Then
If isOnClickAttributsAdded = False Then
writer.AddAttribute("OnClick", "self.setTimeout('OnClick" & Me.UniqueID & "();' ,1);")
isOnClickAttributsAdded = True
End If
CodeJavascript.OnClick("document.getElementById('" & Me.UniqueID & "').disabled=true;")
End If
CodeJavascript.EcrireJavascript()
End Sub
vous avez un exemple concret pour un bouton ici :
http://www.aspfr.com/code.aspx?ID=21560
Source / Exemple :
Imports System.ComponentModel
Imports System.Web.UI
Imports System.Web.UI.Webcontrols
Imports System.Web
Namespace Cyril
Namespace Controls
Public Class EcrireEvenementJavascript
Private _UniqueID As String
Private _Writer As System.Web.UI.HtmlTextWriter
''' -----------------------------------------------------------------------------
''' <summary>
''' Contient toutes les lignes de codes
''' pour chaque Evenement
''' A un index est associé un evenement
''' le numero de l'index est ecrit dans CodeEvenement
'''
''' Chaque ligne de code est séparé par
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [DURAND Cyril] 30/03/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Private aLignesCode(17) As String
''' -----------------------------------------------------------------------------
''' <summary>
''' Un Array qui contient les codes des evenements
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [DURAND Cyril] 30/03/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Private CodeEvenement() As String _
= {"onAbort", "onBlur", "OnChange", _
"OnClick", "onDblclick", "onDragdrop", _
"onError", "onFocus", "onKeydown", _
"onKeypress", "onLoad", "onMouseOver", _
"onMouseOut", "onReset", "onResize", _
"onSelect", "onSubmit", "onUnload"}
Private Enum NomCodeEvenement As Short
onAbort = 0
onBlur = 1
OnChange = 2
OnClick = 3
onDblclick = 4
onDragdrop = 5
onError = 6
onFocus = 7
onKeydown = 8
onKeypress = 9
onLoad = 10
onMouseOver = 11
onMouseOut = 12
onReset = 13
onResize = 14
onSelect = 15
onSubmit = 16
onUnload = 17
End Enum
''' -----------------------------------------------------------------------------
''' <summary>
''' Permet d'initialiser ....
''' </summary>
''' <param name="Writer"> Writer du Controle sur lequel
''' on veut modifier les parametres
''' </param>
''' <param name="UniqueID"> Identifieur unique du controle
''' pour pouvoir créer les fonctions javascript
''' </param>
''' <remarks>
''' </remarks>
''' <history>
''' [DURAND Cyril] 30/03/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Sub New(ByVal Writer As System.Web.UI.HtmlTextWriter, ByVal UniqueID As String)
_UniqueID = UniqueID
_Writer = Writer
End Sub
#Region "Evenement"
''' Chaque méthode permet d'ecrire une ligne de code
''' Dans les evenements choisis pour le controle
Public Sub onAbort(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onAbort) &= "
" & LigneCode
End Sub
Public Sub onBlur(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onBlur) &= "
" & LigneCode
End Sub
Public Sub OnChange(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.OnChange) &= "
" & LigneCode
End Sub
Public Sub OnClick(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.OnClick) &= "
" & LigneCode
End Sub
Public Sub onDblclick(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onDblclick) &= "
" & LigneCode
End Sub
Public Sub onDragdrop(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onDragdrop) &= "
" & LigneCode
End Sub
Public Sub onError(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onError) &= "
" & LigneCode
End Sub
Public Sub onFocus(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onFocus) &= "
" & LigneCode
End Sub
Public Sub onKeydown(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onKeydown) &= "
" & LigneCode
End Sub
Public Sub onKeypress(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onKeypress) &= "
" & LigneCode
End Sub
Public Sub onLoad(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onLoad) &= "
" & LigneCode
End Sub
Public Sub onMouseOver(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onMouseOver) &= "
" & LigneCode
End Sub
Public Sub onMouseOut(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onMouseOut) &= "
" & LigneCode
End Sub
Public Sub onReset(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onReset) &= "
" & LigneCode
End Sub
Public Sub onResize(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onResize) &= "
" & LigneCode
End Sub
Public Sub onSelect(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onSelect) &= "
" & LigneCode
End Sub
Public Sub onSubmit(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onSubmit) &= "
" & LigneCode
End Sub
Public Sub onUnload(ByVal LigneCode As String)
aLignesCode(NomCodeEvenement.onUnload) &= "
" & LigneCode
End Sub
#End Region
''' -----------------------------------------------------------------------------
''' <summary>
''' Permet d'ecrire le code Javascript au controle
''' Cette methode genere un code javascript <>
''' par controle et se place juste avant celui ci
''' </summary>
''' <remarks>
''' /!\ a optimisé
''' </remarks>
''' <history>
''' [DURAND Cyril] 30/03/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Sub EcrireJavascript()
''' On Ecrit le debut du code javascript
_Writer.WriteLine("<script language=javascript>")
''' On Effectue une boucle pour chaque evenement
For i As Integer = 0 To 17
''' On Ecrit du code seulement s'il y en a
If Not aLignesCode(i) = "" Then
''' On Ecrit le nom de la function javscript
''' en fonction du nom de l'evement declenche
''' et de l'identificateur unique du controle concerné
_Writer.WriteLine("function " & CodeEvenement(i).ToString & _UniqueID & "(){")
''' A chaque ligne de code on ecrit la ligne de code
''' Verifier si il n'y a pas d'erreur sur certains char
For Each s As String In Split(aLignesCode(i), "
")
'''On Ecrit seulement si la ligne
''' n'est pas vide ....
If Not s = "" Then
_Writer.WriteLine(s)
End If
Next
''' On Ferme la fonction javascript avec
''' l'accolade fermante
_Writer.WriteLine("}")
End If
Next
''' On Ferme le bloc de script
_Writer.WriteLine("</script>")
End Sub
End Class
Conclusion :
Bug :
- Il me reste encore à integrer certaines chose dans la classe comme la vérification pour savoir si j'ai deja ecrit ou pas dans l'attribut en cours
- Il manque une methode pour tout simplement generer une fonction javascript sans association avec un evenement du controle
- Pour l'instant les evenements se font sur tout les controles meme sur ceux ou l'evenement est impossible par exemple par exemple le dragdrop sur une image qui n'a alors aucun sens voir :
http://www.commentcamarche.net/javascript/jsevent.php3
J'ai fournit dans le zip une assembly contenant egalement mes controles dérivé et le code avec le code d'un bouton
Pour avoir une version de l'assembly la plus recente veuillez consulter cette adresse :
http://jesusonline.free.fr/Cyril/
Hesiter pas à me mettre un commentaire bon ou mauvais du moment qu'il est constructif et me noter, si vous ameliorer le truc dites le moi
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.