Affichage valeur de pourcentage d'une boucle

bonjour,

voilà mon probleme qui me semble etre trés simple et pourtant bien tordu !

j’ai un traitement qui est fait dans une boucle de d’objet générique , a chaque passage , je calcule le pourcentage d’effectuer et veux le renvoyer sur un label coté client. Cependant , il ne m’affiche que la derniere valeur ! ce qui me semble logique puisque l’affichage ne se fait qu’une fois le traitement terminé …

Ma question est : comment mettre à jour mon label avec , à chaque passage dans la boucle , la valeur du pourcentage calculé !

je pense à du jquery avec des appel ajax , mais je ne peux pas mettre ma methode en static !

je seche …

merci pour votre aide !

N

Vu que tu es côté serveur, et que tu veux afficher l’information côté client, tu peux laisser le serveur faire les tâches unitaires (chaque objet), et tu laisse le client lancer la grande boucle (donc via ajax, ou autre).

Via ton script AJAX, quand la page est chargée, tu mets à jour ton affichage.

Salut,
Si tu veux demander au serveur de calculer le pourcentage c’est qui il y a surement un traitement a effecter (comme mettre a jour une table u fichier ou autre) ?
Dans ce cas tu as deux options calculer le prctage coté serveur ou coté client
le plus simple coté client.
Je commence avec un tableau d’adresse mails avec lesquels je souhaite envoyer le même message.
Je créer une fonction qui servira de fonction recursive

function sendMail(){
//1 get Mail
var _mailItem=$('[name=listMail]').children('option')[0];
var _mail=$(_mailItem).val();
$.ajax({
url:'sendMail.php?mail='+_mail,
type:'GET',
success:function(data){
$('label[name=prct]').html(ton_pourcentage);
sendMail()
}
});
}

Voila il ne te reste plus qu’a créer la fonction Serveur qui retourne un code Statut “{statut:‘ok’}” ou “{statut:‘error’}”
Le reproche c’est que cette fonction met ne se termine en fait jamais. et risque de peser sur la mémoire

bonjour,

merci de vos réponse,

j’ai commencé en AJAX Jquery , mais du fait de la méthode static , je perds beaucoup de mes objets (necessaire à ma boucle !!! ) et je ne vois pas comment y remedier


En fait , voilà mon cheminent de code :

j’ai un bouton , sur lequel j’ai l’action click coté serveur… sur ce code ,j’ai du traitement et une boucle dans laquelle à chaque itération je veux mettre à jour l’affichage du pourcentage effectué ( que je calcule à chaque itération , donc j’ai sa valeur )

Si j’ai compris ton idée c’est que tu veux laisser ton serveur gérer sa boucle et demander a ta page client d’afficher la progression a chaque itération serveur
C’est pas aussi évident mais la solution la mieux adaptée est de passer par un mode asynchrone.
Avec jQuery, toute les requête AJAX sont transmise par défaut de manière asynchrone.
L’idée serait d’utiliser l’attribut “complete”


[...]
$.ajax({
url: tonurl,
type : 'GET'|'POST'
complete:function(xhr){
if(xhr.readyState==4)
//dire quoi faire
},
done:function(){
//La boucle est terminée
}
})

Sa va envoyer la requête sur le serveur, et en principe va déclencher la fonction “complete” a chaque itération mais je suis pas sur de moi

Bonne Chance !

bonjour,

ça ne marche pas … le complete ne se fait qu’à la fin de ma boucle de traitement , donc il est deja à 100%

bonjour,

coté client j’ai :


var intervalID;
...
intervalID=setInterval(updateProgress, 250);
....
function updateProgress() {          
            
            $.ajax({
                type: "POST",
                url: "page.aspx/GetPourcentage",
                contentType: "application/json; charset=utf-8",
                success: function(msg) {
                    $("#pourcentValue").html(100);
                    clearInterval(intervalID);
                },
                error:function(xhr,err){
                    alert("readyState: "+xhr.readyState+"\nstatus: "+xhr.status);
                    alert("responseText: "+xhr.responseText);
                }
            });
                        
            var val= $("input[id$='hdfPourcentage']").val();
            var value = $("#progressbar").progressbar("option", "value");
            
            if (value < 100) {
                // au lieu du 1 mettre val , mais hidden field toujorus à 0 ????!!!!!
                $("#progressbar").progressbar("value", value + 1);   
                    $("#pourcentValue").html($("#progressbar").progressbar("option", "value"))  ;       
            }
        }  

coté serveur :


private static int PourcentageValue;

.....

mamethode()
{

...
//boucle de traitement
foreach(int i in mlstId)
{
   .....
   hdfPourcentage.Value = (i * 100 / mlstId.Count).ToString();
   PourcentageValue = i * 100 / mlstId.Count;

}

}


[System.Web.Services.WebMethod]         
public static string GetPourcentage()
{
   return PourcentageValue.ToString();
}   


Dans “success”, vous paramètrer la valeur par défaut à 100.
Quoi qu’il arrive, quelque soit le resultat serveur, se sera toujours 100%.
Si vous affichiez le contenu de la variable “msg”, celui-ci vous affichera encore 100%
Le “foreach” correspond a une boucle que je qualifierai de basique
Pour un probleme tel que le votre je vous suggère un méthode d?itération dédiée
coté serveur


private static int index=-1;
.....
mamethode()
{
if(index+1<mlstId.Count)
{
index++;
}
hdfPourcentage.Value = (index * 100 / mlstId.Count).ToString();
return convert.toDouble(hdfPourcentage.Value)
}
.......
[System.Web.Services.WebMethod] 
 public static string GetPourcentage() 
{ return mamethode(); }  
}

Coté client

var intervalID; 
... 
intervalID=setInterval(updateProgress, 250); 
....
 function updateProgress() { 
  $.ajax({ type: "POST", 
url: "page.aspx/GetPourcentage", 
contentType: "application/json; charset=utf-8", 
success: function(msg) { 
clearInterval(intervalID); 
if(msg<100){
$("#pourcentValue").html(msg); 
var val= $("input[id$='hdfPourcentage']").val(); 
$("#progressbar").progressbar("value", msg); 
intervalID=setInterval(updateProgress, 250); 
}
}, 
error:function(xhr,err){ 
alert("readyState: "+xhr.readyState+"\nstatus: "+xhr.status); 
alert("responseText: "+xhr.responseText); } 
});  
} 

Il est possible qu'il faille recorriger le code des deux coté(le ré-adapté ou corriger les incohérences). L'effet de cette méthode c'est que tant que votre itération (boucle) ne sera pas terminée, celle-ci se ré-exécutera et notera la progression en prime. De plus la correction coté client libére les ressources a chaque itération (l'utilisateur n'aura pas le sentiment que la progressbar constitue le MainProcess et pourra faire d'autre truc)

Logiquement, se doit être bon
Bonne chance !
Edité le 18/12/2012 à 11:08

Bonjour,
J’ai presque le meme probléme :frowning: et je suite débutante avc ajax si vous avez trouvez la solution merci de la poster :slight_smile:

Hello,

Résumons : Tu à une boucle qui est actionné avec un bouton et tu veut qu’a chaque loop tu affiche le % de progression de ta boucle quelques part dans la page web c’est bien ça ?

Côté javascript j’aurai fais 2 fonctions, celle qui lance l’action principale ( lancer le processus de boucle sur le serveur ) en cliquant sur le bouton. Puis une deuxième fonction secondaire qui ne s’occupe que de l’affichage du pourcentage et lancée à chaque calcul de la boucle.