IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Rendre un bouton Enabled/Disabled "dynamiquement"


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut Rendre un bouton Enabled/Disabled "dynamiquement"
    Bonjour, j'espere poster au bon endroit
    J'aurais besoin de vos lumières concernant la modification de l'état d'un bouton.
    J'ai une gridview, un bouton "Calculer Propositions" .

    Quand on clique sur le bouton, ca lance une méthode qui boucle sur plusieurs appels en base.

    Mon probleme est qu'il est possible que le traitement d'un appel dure un certain temps au risque de voir l'utilisateur cliquer encore une fois sur le bouton. Biensur, Il y a incrementation pour l'iteration une fois que la procedure stockée a fini de calculer, mais pendant ce temps, le bouton reste "cliquable".

    Donc, j'aimerais pouvoir mettre le bouton sur enabled=false, que le traitement se fasse puis le remettre sur True.

    Dans le code j'ai bien enabled=false des qu'on clique, puis True des que la methode est fini, mais ca ne change rien.

    J'ai bien sur, fait appel a ma methode display() qui actualise juste apres avoir mis enabled=false, mais rien n'y fait. L'impression que j'en ai, (enfin d'apres ce que je vois quand je pose des points d'arrets) c'est qu'il ne fait pas d'actualisation en cours d'une methode, il la fait qu'en derniere, une fois que tout le reste est passé.

    Voici, le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
      protected void btnCalculerProposition(object sender, EventArgs e)
            {
     
     
                PropositionComputing(true);
                this.Display(); //ACTUALISATION
     
    		}
     
     protected void PropositionComputing(bool do_it)
            {
     
    			if(do_it)
                {
     
                    //ici j'avais essaye faire ca : this.btnCalculProposition.Enabled = false;
                    GlTerrainController cont = new GlTerrainController();
                    foreach (GridViewRow row in grdObjectifMagasin.Rows)
                    {
                        int? idObjectifMagasin = null;
     
                        HiddenField hf = row.FindControl("hdf_gl_objectifs_magasins_id") as HiddenField;
                        if (hf.Value.Length > 0)
                        {
                            idObjectifMagasin = int.Parse(hf.Value);
                            cont.Calcul_Proposition_Objectif(idObjectifMagasin); //APPEL A LA BASE
     
                        }
     
                    }
                    //ici j'avais essayé faire ca : this.btnCalculProposition.Enabled = true;
                }
            }

    Ou bien, n'y a t il pas un moyen, le plus simple possible :-), de figer l'écran tant que toutes les itérations ne sont pas passées ?.

    En fait, ce qui m'intéresse vraiment, ce serait que lorsque l'utilisateur clique sur le bouton, l'appli lance ses appels en base et ne rende la main a l'utilisateur QUE lorsque TOUTES les iterations sont passées.

    J'avoue m'arracher les cheveux la dessus, je débute en C#, donc peut être qu'il me manque encore des billes pour tout comprendre...

    Merci beaucoup !

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 214
    Points
    214
    Par défaut
    Effectivement je viens de faire le test et bien que le bouton apparait à l'écran comme inactif, il reste réceptif quand on clique dessus, ce qui fait qu'en fin de traitement l'événement est tout de même déclenché !

    Je pense que ca vient du fait que l'eventhandler s'exécute dans un thread séparé, du coup au moment où on reclique l'état du bouton dans le thread principal est toujours actif, son statut n'étant mis à jour qu'une fois le traitement terminé.

    Par contre je ne suis pas encore assez calé en gestion des événements pour savoir comment contourner ce problème.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Merci, au moins je suis pas fou, on est au moins deux a constater la même chose.

    Bon j'espère qu'une âme charitable pourra répondre . . .


    Peut etre du java script ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 214
    Points
    214
    Par défaut
    Je ne sais pas si ca va faire avancer le schmilblick mais il y a exactement le même problème avec VB6

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Je trouve ca étrange qu'il n'y ait pas de solution, car c'est le genre de trucs qui doit souvent être requis dans les applis
    Please, help !!!! j'ai plus beaucoup de cheveux a force de me les arracher !!!!!

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Salut,

    euh c'est de l'ASPNET ? j'ai vu un HiddenField c'est pour ça.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 214
    Points
    214
    Par défaut
    Encore plus fort : en remplaçant .Enabled = false par .Visible = false et en cliquant là où est supposé se trouver le bouton, l'événement Click se déclenche également !

    La seule solution que je vois est de masquer carrément la feuille pendant la durée du traitement...

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 214
    Points
    214
    Par défaut
    J'ai une autre solution un peu plus acceptable à te proposer, en ajoutant simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox.Show(this, "Traitement terminé");
    à la fin du traitement, l'événement Click ne se redéclenche plus.

    Si quelqu'un pouvait nous expliquer pourquoi, je serais curieux de connaître le fin mot de cette histoire !

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par captainKirk Voir le message
    J'ai une autre solution un peu plus acceptable à te proposer, en ajoutant simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox.Show(this, "Traitement terminé");
    à la fin du traitement, l'événement Click ne se redéclenche plus.

    Si quelqu'un pouvait nous expliquer pourquoi, je serais curieux de connaître le fin mot de cette histoire !
    Non pas vraiment. Le messagebox s'affiche sur le serveur pas sur le client. Si ça marche en debug c'est uniquement parce que le serveur et le client sont la même machine.

    Il vaut mieux passer par un script javascript sur l'événement OnClientClick pour mettre le statut enabled à false lors du click.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 214
    Points
    214
    Par défaut
    Ouais mais la on est en Winform et pas en Webform non ?

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par captainKirk Voir le message
    Ouais mais la on est en Winform et pas en Webform non ?
    Regarde le code posté au départ et tu auras la réponse à ta question.
    HiddenField, GridView c'est de l'ASP.NET
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Regarde le code posté au départ et tu auras la réponse à ta question.
    HiddenField, GridView c'est de l'ASP.NET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox.Show(this, "Traitement terminé");
    MessageBox et HiddenField ?



    Vu que ton traitement principal est dans btnCalculerProposition, et qu'il n'y a pas d'aller-retour serveur, pourquoi ton bouton changerait d'état ?

    utiliser simplement un minuscule js pour désactiver le bouton sur le clic, ça suffira.

  13. #13
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 38
    Points : 50
    Points
    50
    Par défaut
    OOh les gars vous délirez ou quoi.
    c'est le principe même des applications servers.
    je m'explique :
    quand tu cliques sur le bouton , une requête est envoyée au serveur pour exécuter ton code C#,PHP ou j'en sais quoi
    une fois que le le serveur aura terminé son travail,il envoie une réponse au navigateur et un rendu html pour l'affichage.
    pendant tout ce temps là ton site est en attente de la réponse.

    j'essaye encore ,je suis tres mauvais pédagogue
    1. je clique une 1ere fois
      une requete est envoyée au serveur pour le traitement(c'est là qu'il va traiter ton bouton.enabled=false)
      tu cliques une deuxieme fois avant l'arrivée de la réponse.
      l'action est mise en file d'attente ,attendant le retour de la premiere(et oui ,il faut faire la queue comme tout le monde)

    je ne pourrai etre plus clair.

    solutions
    javascript.
    onclick="document.getElementById('btn') désactiver caché ou ce que tu veux) ça s'ex"cute avant l'envoi au serveur.
    sinon il ya la techno AJAX je suppose que t'en es pas encore là

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 214
    Points
    214
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Regarde le code posté au départ et tu auras la réponse à ta question.
    HiddenField, GridView c'est de l'ASP.NET
    OK désolé j'ai survolé le code vite fait et j'ai cru que c'était un DataGridView en C#.

    Il n'empêche qu'il y a exactement le même prb en winform C# et sous VB6 et là on peut pas faire de javascript, du coup msgbox obligatoire à la fin du traitement ^^

  15. #15
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par AghilasB Voir le message
    OOh les gars vous délirez ou quoi.
    c'est le principe même des applications servers.
    je m'explique :
    quand tu cliques sur le bouton , une requête est envoyée au serveur pour exécuter ton code C#,PHP ou j'en sais quoi
    une fois que le le serveur aura terminé son travail,il envoie une réponse au navigateur et un rendu html pour l'affichage.
    pendant tout ce temps là ton site est en attente de la réponse.

    j'essaye encore ,je suis tres mauvais pédagogue
    1. je clique une 1ere fois
      une requete est envoyée au serveur pour le traitement(c'est là qu'il va traiter ton bouton.enabled=false)
      tu cliques une deuxieme fois avant l'arrivée de la réponse.
      l'action est mise en file d'attente ,attendant le retour de la premiere(et oui ,il faut faire la queue comme tout le monde)

    je ne pourrai etre plus clair.

    solutions
    javascript.
    onclick="document.getElementById('btn') désactiver caché ou ce que tu veux) ça s'ex"cute avant l'envoi au serveur.
    sinon il ya la techno AJAX je suppose que t'en es pas encore là
    +1
    Sauf que la seconde action n'attend pas la fin de la première

  16. #16
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Salut, tout le monde, desolé, j'etais en congés, je lis tout ce que vous avez ecrit et je reviens vers vous apres
    merci encore

  17. #17
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Alors oui, c'est une appli de gestion qui utilise de l'ASP.
    Je débute en dotNet, donc pardonnez mon jargon et mes questions qui peuvent vous paraitre simplistes et évidents.

    Donc j'ai bien l'affichage de ma page en ASP, le code behind en C#.

    J'ai essayé de désactiver le bouton en utilisant du java script, le problème est que le bouton se désactive mais ne se réactive plus après.

  18. #18
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    j'ai modifié mon code en encapsulant mon panel avec un update panel
    et aussi ajouté du code la methode du onclick

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    protected void btnCalculerProposition(object sender, EventArgs e)
            {
                this.btnCalculProposition2.Enabled = false;
     
                up01.Update();
     
                PropositionComputing(true);
                this.btnCalculProposition2.Enabled = true;
                up01.Update();
                this.Display();
            }
    MAIS il met a jour mon bouton qu'a la fin du traitement, et que je mette update ou pas, c'est pareil, il suffit juste de mettre le enabled,et une fois la methode PropositionComputing() est terminée il met a jour mon bouton avec le dernier btnCalculProposition2.Enabled enregistré.
    Je n 'arrive pas a lui faire faire dans l'ordre que je veux.

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    essaye ce code, peux être à adapter avec ton contexte (id, nom, event, ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        <asp:Button ID="test" runat="server" Text="MonButton" onclick="btnCalculerProposition" OnClientClick="this.disabled=true;" UseSubmitBehavior="false" />

  20. #20
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Ca fonctionne nickel, mon seul problème est que je dois utiliser une classe de boutons particulières liée au progiciel, qui est un aquaButton et qui bien sur, ne fonctionne pas avec cette methode (il manque des propriétés comme UseSubmitBehavior)

    On a déjà eu des soucis avec ces boutons....
    En tout cas ca me donne des pistes, et ca marche bien avec un bouton classique.
    Merci beaucoup. Je continu de chercher pour trouver une méthode qui marche avec ces fichus Aquaboutons

Discussions similaires

  1. rendre un champ enable/disable
    Par Edta dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 21/08/2009, 15h17
  2. Rendre un bouton disabled (deux actions sur le même bouton)
    Par beegees dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/11/2008, 10h46
  3. [xsl]simuler le mecanisme OO de "liaison dynamique"
    Par philemon_siclone dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 19/12/2003, 11h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo