Accueil > Forum > > > > Implements ICallbackEventHandler problème
Implements ICallbackEventHandler problème
dimanche 26 février 2006 à 11:34:30 |
Implements ICallbackEventHandler problème

cYoann
|
Salut, Voilà j'ai crée un webcontrol qui implemente l'interface ICallbackEventHandler (un bouton qui déclenche un évenement onClick sans recharger la page...) tout fonctionne, RaiseCallbackEvent et GetCallbackResult (j'utilise asp.net 2).... Le control fait ce que je souhaite et déclenche deux scripts (javascript) * function OnCallBackStart (Button) au début (quand on click dessus, en plus de WebForm_DoCallback..) * function OnCallBackEnd (Results, Button) à la fin
MAIS, si j'ajoute 2 boutons sur ma page et que je click sur les deux l'un après l'autre mes deux événements OnClick sont déclenchés, tout va bien le premier bouton qui termine sa tache déclenche OnCallBackEnd et affiche le résultat souhaité le second bouton lui ne le déclenche pas ! et n'affiche donc pas le résultat demandé pourtant GetCallbackResult pour les 2 boutons est appelés normalement. J'espère que je mon problème est compréhensible ! Si vous avez besoins de précisions... allez-y Cordialement, Yoann.
|
|
dimanche 26 février 2006 à 12:55:37 |
Re : Implements ICallbackEventHandler problème

jesusonline
|
Si j'ai bien compris tu essayes de faire 2 requetes ajax en meme temps ? tu cliques sur le premier, ca t'en fait une et avant que celle ci soit finit tu clicks sur le 2eme ? et ca plante :( par contre si tu clicks sur le premier t'attend qu'il finisse puis sur le 2eme ca fonctionne ? et si tu clicks 2 fois sur le meme bouton ? et tu pourrais nous montrer un peu de ton code / rendu ? que je voit mieux :)
Cyril - MVS - MCP ASP
|
|
dimanche 26 février 2006 à 13:51:36 |
Re : Implements ICallbackEventHandler problème

cYoann
|
ouai c'est exactement ça, je clic sur le premier bouton, puis sur le deuxième avant que la première requête ne soit terminée et la requête la plus lente "plante" quand je clic sur les boutons l'un après l'autre en attendant que chaque requête se termine ça marche
si je clic deux fois sur un même boutons il n'y a aucun aucun problème ! quand je clic sur un bouton OnCallBackStart (javascript) est déclenché et mon bouton se grise :)
quand la requête se termine OnCallBackEnd (toujours du javascript) se charge de "dégriser" le bouton et d'afficher le résultat.
le code du control : j'ai tout copier-coller dans le doute mais certaines partie ne sont peut-être pas nécessaire pour trouver le problème...
Imports System.Web.UI.WebControls Imports System.Web.UI Imports System.ComponentModel Imports System.Collections.Specialize
<DefaultEvent("Click"), DefaultProperty("Text")> _ Public Class CallBackButton Inherits WebControl Implements ICallbackEventHandler
#Region " Déclarations privées " Private Result As String = String.Empty Private Result_header As String = String.Empty Private NameOfRequestArguments As ArrayList #End Region
Public Event Click(ByVal Args As NameValueCollection)
#Region " Utils " Public Function RenderOtherControl(ByVal WebControl As WebControl) As String Dim Sw As New IO.StringWriter, W As New HtmlTextWriter(Sw), R As String
WebControl.RenderControl(W) R = Sw.ToString
W.Flush() : Sw.Flush() W.Dispose() : Sw.Dispose()
Return R End Function #End Region
#Region " Properties " Public Property Text() As String Get Dim Obj As Object = ViewState("Text") If Obj Is Nothing Then Obj = Me.ID Return CType(Obj, String) End Get Set(ByVal value As String) ViewState("Text") = value End Set End Property Public Property ValidationGroup() As String Get Dim Obj As Object = ViewState("ValidationGroup") If Obj Is Nothing Then Obj = "" Return CType(Obj, String) End Get Set(ByVal value As String) ViewState("ValidationGroup") = value End Set End Property Public Property CauseValidation() As Boolean Get Dim Obj As Object = ViewState("CauseValidation") If Obj Is Nothing Then Obj = True Return CType(Obj, Boolean) End Get Set(ByVal value As Boolean) ViewState("CauseValidation") = value End Set End Property Private Property RequestArguments() As ArrayList Get Dim Obj As Object = ViewState("RequestArguments") If Obj Is Nothing Then Obj = New ArrayList Return CType(Obj, ArrayList) End Get Set(ByVal value As ArrayList) ViewState("RequestArguments") = value End Set End Property #End Region
#Region " AddRequestArgument " Public Sub AddRequestArgument(ByVal WebControl As WebControl, ByVal [Property] As String) AddRequestArgument(WebControl.UniqueID.Replace("$", "_"), [Property], WebControl.ID) End Sub Public Sub AddRequestArgument(ByVal Id As String, ByVal [Property] As String, Optional ByVal FutureAccessName As String = "") Dim A As ArrayList = RequestArguments If A Is Nothing Then A = New ArrayList A.Add("document.getElementById('" & Id & "')." & [Property]) RequestArguments = A If NameOfRequestArguments Is Nothing Then NameOfRequestArguments = New ArrayList NameOfRequestArguments.Add(IIf(FutureAccessName = "", Id, FutureAccessName)) End Sub #End Region
#Region " AddResult " Public Sub AddResult(ByVal HtmlControl As HtmlControls.HtmlGenericControl, ByVal [Property] As String, ByVal Value As String) AddResult(HtmlControl.UniqueID.Replace("$", "_"), [Property], Value) End Sub Public Sub AddResult(ByVal WebControl As WebControl, ByVal [Property] As String, ByVal Value As String) AddResult(WebControl.UniqueID.Replace("$", "_"), [Property], Value) End Sub Public Sub AddResult(ByVal Id As String, ByVal [Property] As String, ByVal Value As String) Result &= Id & ":" & [Property] & ":" & Value Result_header &= (Id & ":" & [Property] & ":" & Value).Length & ":" End Sub #End Region
#Region " Implémentation ICallbackEventHandler " Private Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult If Result = "" Then Return "" Dim R As String = Result_header.Remove(Result_header.Length - 1, 1) & " " & Result Result = "" Result_header = "" Return R End Function
Private Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent Try Dim A As NameValueCollection = GetRequestArguments(eventArgument) RaiseEvent Click(A) Catch ex As Exception Throw New Exception("Erreur (" & Me.ID & ") :<br />" & ex.Message) End Try End Sub #End Region
#Region " Overrides OnInit " Protected Overrides Sub OnInit(ByVal e As System.EventArgs) MyBase.OnInit(e)
Page.ClientScript.RegisterHiddenField(Me.UniqueID & "_value", Me.Text) 'On déclare un champ caché contenant la propriété text
If Me.CauseValidation Then Page.ClientScript.RegisterClientScriptResource(GetType(BaseValidator), "WebUIValidation.js") 'On doit déclarer le script WebUIValidation.js qui contient la fonction Page_ClientValidate tant désirée :p
If Not Page.ClientScript.IsClientScriptBlockRegistered(Me.GetType, "CallBackButton") Then Dim Script As New Text.StringBuilder
Script.AppendLine("function OnCallBackStart (Button) {") 'Script.AppendLine("alert('Start :' + Button.name);") Script.AppendLine(" Button.disabled = true;") Script.AppendLine(" Button.value = 'requête en cours...';") Script.AppendLine("}")
Script.AppendLine("function OnCallBackEnd (Results, Button) {") Script.AppendLine(" Button.disabled = false;") Script.AppendLine(" Button.value = document.getElementById(Button.name + '_value').value;") Script.AppendLine(" var header = Results.substr(0,Results.indexOf(' ')).split(':');") Script.AppendLine(" cPosition = Results.indexOf(' ') + 1;") Script.AppendLine(" for (var i = 0; i < header.length; i++) {") Script.AppendLine(" var item = Results.substr(cPosition, header[i]);") Script.AppendLine(" var id = item.split(':')[0];") Script.AppendLine(" var property = item.split(':')[1];") Script.AppendLine(" var value = item.substr(id.length + property.length + 2, header[i] - id.length - property.length - 2);") Script.AppendLine(" document.getElementById(id)[property] = value;") Script.AppendLine(" cPosition += Math.round(header[i]);") Script.AppendLine(" }") Script.AppendLine("}")
Script.AppendLine("function GetArgs(Args) {") Script.AppendLine(" var header = '';") Script.AppendLine(" for (var i = 0 ; i < Args.length ; i ++) {") Script.AppendLine(" header += ' ';") Script.AppendLine(" if (typeof(Args[i]) != 'number') {") Script.AppendLine(" var subArgs = Args[i].split('\n');") Script.AppendLine(" for (var j = 0 ; j < subArgs.length ; j ++) {") Script.AppendLine(" header += subArgs[j].length;") Script.AppendLine(" if (j < subArgs.length - 1) header += ':';") Script.AppendLine(" }") Script.AppendLine(" } else {") Script.AppendLine(" Args[i] += '';") Script.AppendLine(" header += Args[i].length;") Script.AppendLine(" }") Script.AppendLine(" }") Script.AppendLine(" return (new Array(header, Args));") Script.AppendLine("}")
Page.ClientScript.RegisterClientScriptBlock(Me.GetType, "CallBackButton", Script.ToString, True) End If End Sub #End Region
#Region " GetRequestArguments " 'Encodage javascript Private Function GetRequestArguments() As String If RequestArguments.Count = 0 Then Return String.Empty Dim Args As String = "GetArgs(new Array(" For i As Integer = 0 To RequestArguments.Count - 1 Args &= RequestArguments(i) 'If i <> RequestArguments.Count - 1 Then Args &= ", " Args &= "," Next Return Args & "''))" End Function
'Décodage javascript Private Function GetRequestArguments(ByVal Value As String) As NameValueCollection Dim Args As New NameValueCollection If Value = "" Then Return Args Dim Header As String = Value.Substring(0, Value.IndexOf(",")).Trim(" ")
Dim CurrentPosition As Integer = Header.Length + 2 Dim i As Integer = 0 For Each ArgLength As String In Header.Split(" ") Dim Arg As String = "" For Each SubArgLength As String In ArgLength.Split(":") Arg &= Value.Substring(CurrentPosition, SubArgLength) & vbCrLf CurrentPosition += SubArgLength + 1 Next If i < NameOfRequestArguments.Count Then Args.Add(NameOfRequestArguments(i), Arg.Remove(Arg.Length - vbCrLf.Length, vbCrLf.Length)) i += 1 Next
Return Args End Function #End Region
#Region " Render " Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) Dim ValidationScript As String = IIf(Me.CauseValidation, "if(!Page_ClientValidate('" & Me.ValidationGroup.ToString & "')) return; ", "")
Dim Button As New HtmlControls.HtmlInputButton Button.ID = Me.UniqueID Button.Value = Me.Text Button.Attributes.Add("onclick", "javascript:" & ValidationScript & "OnCallBackStart(this);" & Page.ClientScript.GetCallbackEventReference(Me, GetRequestArguments, "OnCallBackEnd", Me.UniqueID) & ";") 'Button.Attributes.Add("onclick", "javascript:" & ValidationScript & "OnCallBackStart(this);" & Page.ClientScript.GetCallbackEventReference(Me, GetRequestArguments, "OnCallBackEnd_" & Me.UniqueID, Me.UniqueID) & ";") Button.Attributes.Add("class", Me.CssClass) Button.RenderControl(writer) End Sub #End Region
End Class
un peut lourd ?! la région AddRequestArgument, permet juste de récupérer des variables pour l'événement Click (par exemple le texte contenu dans un textbox...) la région AddResult quand à elle sert à retourner le/les résultats (par exemple 'b1 terminé' à écrire dans une div...)
ma page qui permêt de tester "le bug" : <div id="state"></div> <cc1:CallBackButton Text="button 1" ID="b1" runat="server" /> <cc1:CallBackButton Text="button 2" ID="b2" runat="server" />
et son code : Protected Sub b1_Click(ByVal Args As System.Collections.Specialized.NameValueCollection) Handles b1.Click Dim o As Integer = 0 For i As Integer = 0 To 500000000 o += 1 Next b1.AddResult("state", "innerHTML", "b1 terminé") End Sub
Protected Sub b2_Click(ByVal Args As System.Collections.Specialized.NameValueCollection) Handles b2.Click Dim o As Integer = 0 For i As Integer = 0 To 2000000 o += 1 Next b2.AddResult("state", "innerHTML", "b2 terminé") End Sub
voili, jespère que ça va t'aider.
|
|
dimanche 26 février 2006 à 14:47:59 |
Re : Implements ICallbackEventHandler problème

jesusonline
|
Réponse acceptée !
Aprés relecture du code du ClientCallBack j'ai trouvé ce qui cloche. Il faut mettre le paramètre useAsync à true
Page.ClientScript.GetCallbackEventReference( Me, GetRequestArguments, "OnCallBackEnd", Me.UniqueID, True)En effet lorsque l'on regarde le js qui est produit par .net on retrouve : if (!useAsync) { if (__synchronousCallBackIndex != -1) { __pendingCallbacks[__synchronousCallBackIndex] = null; } __synchronousCallBackIndex = callbackIndex; } est par défaut useAsync est à false ! ce qui veut dire que les requetes ajax sont annulés ! (j'ai pas vu de doc la dessus donc je vais surement blogger) Par contre ce que je peux te conseiller c'est au lieu d'écrire le javascript directement dans la page, sert toi des webRessources pour externaliser le js :) En tout cas ton controle à l'air trés sympathique j'ai un peu parcouru ton code et ca ressemble beaucoup à ma facon d'ecrire ;) n'hésite pas à déposer ton controle sur ce site avec de la documentation une fois qu'il sera finit ;)
Cyril - MVS - MCP ASP
|
|
dimanche 26 février 2006 à 14:51:24 |
Re : Implements ICallbackEventHandler problème

cYoann
|
merci ! pour la réponse et les conseils 
|
|
Cette discussion est classée dans : bouton, problème, déclenche, icallbackeventhandler, implements
Répondre à ce message
Sujets en rapport avec ce message
Problème de datagrid + textBox [ par jagdjg ]
Bonjour, j ai un datagrid que je remplit avec un datatable.j ai ajouté au datagrid une colonne checkBox.J ai un bouton qui devrait tester le checkBoxL
Probleme de recherche [ par thieu57 ]
Hello,J'ai un petit problème...J'ai une fonction de recherche avec un textbox, une liste deroulante et un bouton pour envoyer.Est ce que l'on peut don
Problème avec la touche enter sur webform [ par vonbier ]
Hello, j'ai un petit prob pour gérer la touche enter sur mes pages. J'ai par exemple une page contenant plusieur boutons, mais lorsque je clic enter l
Datagrid problème [ par lenneth666 ]
Voila dans mon application j'ai une datagrid avec deux colonnes de bouton. J'aimerai savoir comment on c'est sur quel bouton a cliqué l'utilisateur.
problème avec un bouton créer dynamiquement [ par lenneth666 ]
Voila dans mon code j'ai Dim btn As New Button() btn.Text = "Dynamique " & i.toString btn.attributes("runat") = "server" btn.width= new Unit("
problème de frame [ par flo7554 ]
En effet j'ai une page avec plusieurs frames dont une sur laquelle se trouve une liste déroulante et un bouton seulement je voudrais qu'en cliquant su
Bouton CauseValidation et problème sur plusieurs Validator [ par ecume333 ]
Bonjour à tous, J'ai un soucis, j'explique : j'ai deux champs text avec deux bouton associés, mon but est que le bouton 1 valide le champ 1 Je veux
Bouton avec attributs [ par cyclotor ]
Bonjour à tous,J'ai un soucis avec un bouton qui me permet de lancer une recherche en fonction d'un critère que j'ai dans une texte box. Le principe e
problème en ASP [ par dreufys ]
Salut à tous excusez moi de vous déranger mais j ai un petit problème, je suis un peu bloqué sur un programme en asp.Il faudrait que je gère un écran
Plusieurs bouton pour plusieurs submit [ par v.massip ]
Bonjour à tous!J'ai un petit problème sur l'une de mes pages web!J'ai développé un formulaire contenant 3 champs de saisie et 3 boutons de validation.
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|