Partage
  • Partager sur Facebook
  • Partager sur Twitter

Navigation de page en page

    17 janvier 2018 à 15:35:40

    Bonjour à tous,

    J'ai un souci pour basculer d'une page à une autre suite, lorsque vous appuyez sur un simple bouton valider.

    J'ai une première fenêtre me donnant des données dans un tableau :

    Le bouton "Valider" envoie un simple message d'alerte pour demander la sélection d'un item : 

    Puis, une fois que vous avez sélectionné un ou plusieurs items, vous arrivez sur le 2ème ecran qui me donne d'autres données en fonction de la première sélection : 

    Pour info, j'ai remarqué que je suis toujours sur l'adresse URL (http://localhost:65224/WebForm1.aspx)de la première page, alors que j'ai changé de visuel, et que le code correspond à une autre page.

    Puis, que vous décidiez de cocher ou non les checkbox, ou que vous validiez sans rien, l'écran suivant apparaît :

    Les tableaux disparaissent, et l'adresse URL en localhost est passé sur la 2eme page (http://localhost:65224/WebForm2.aspx), alors que je dois passer sur la 3eme page.

    Voici mon code de la 2eme page pour passer sur la 3eme : 

    protected void btn_final_validation_Click(object sender, EventArgs e)
            {
                
    
                foreach (GridViewRow row in gvResult.Rows)
                {
                    CheckBox cb = (CheckBox)row.FindControl("FinalChk");
                    CheckBox cb2 = (CheckBox)row.FindControl("FinalChkForm");
    
                    if ((cb != null && cb.Checked) || (cb2 != null && cb2.Checked))
                    {
                        Server.Transfer("~/WebForm3.aspx");
                        //cb2.Visible = false;
                        //Response.Redirect("WebForm3.aspx");
                    }
                    else
                    {
                        //ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Veuillez sélectionner au moins un item')", true);
                        Page.ClientScript.RegisterStartupScript(this.GetType(), "Scripts", "<script>alert('Vous devez sélectionnere au moins 1 item.');</script>");
                    }
                }
    
                foreach (GridViewRow row in gvResultForm.Rows)
                {
                    CheckBox cb = (CheckBox)row.FindControl("FinalChkForm2");
                    if (cb != null && cb.Checked)
                    {
                        Server.Transfer("~/WebForm3.aspx");
                    }
                }
    
                foreach (GridViewRow row in gvResultFormSelected.Rows)
                {
                    CheckBox cb = (CheckBox)row.FindControl("FinalChk2");
                    if (cb != null && cb.Checked)
                    {
                        Server.Transfer("~/WebForm3.aspx");
                    }
                }
            }

    J'ai utilisé ce code pour passer de la 1ere pagee à la 2eme et ça fonctionne bien. Je n'ai aucune erreur, mais je ne comprend pas je ne change pas de page.

    J'ai utiliser la ligne suivante pour passer sur la 3eme page...

    Response.Redirect("WebForm3.aspx");

    et en test (code unique dans la méthode), ça fonctionne bien et je passe sur la page 3. Le problème,c'est que ça ne gèrera pas les checkbox cochés ou non.

    Qu'en pensez-vous ?

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      17 janvier 2018 à 15:42:01

      ClémentPraudel1 a écrit:

      Qu'en pensez-vous ?


      Passe en MVC :)

      Non sérieusement,

      ClémentPraudel1 a écrit:

      Pour info, j'ai remarqué que je suis toujours sur l'adresse URL (http://localhost:65224/WebForm1.aspx)de la première page, alors que j'ai changé de visuel, et que le code correspond à une autre page.

      Est-ce que tu es sûr du chemin que suit ton application ? Est-ce que ton application appelle le Page_Load de ta page WebForm2.aspx ?

      • Partager sur Facebook
      • Partager sur Twitter
        17 janvier 2018 à 15:51:09

        Dans mon WebForm2.aspx.cs, j'ai crée une méthode pour récupérer les éléments coché dans une liste et les exploiter, pour les insérer dans le tableau.

        Voici la méthode : 

        public List<string> ListResult(string gridviewCtrl, string checkboxCtrl)
                {
                    List<string> List_name = new List<string>();
        
                    if (this.Page.PreviousPage != null)
                    {
                        GridView GridView1 = (GridView)this.Page.PreviousPage.FindControl(gridviewCtrl);
        
                        foreach (GridViewRow row in GridView1.Rows)
                        {
                            if (row.RowType == DataControlRowType.DataRow)
                            {
                                CheckBox chkRow = (row.Cells[0].FindControl(checkboxCtrl) as CheckBox);
                                if (chkRow.Checked)
                                {
                                    string name = row.Cells[1].Text;
                                    List_name.Add(name);
                                }
                            }
                        }
                    }
                    return List_name;
                }

        Puis, la méthode est appelé dans le Page_Load.

        EDIT : 

        J'ai refait ce code dans la Page_Load du WebForm3, mais rien n'y fait, toujours le même problème.

        -
        Edité par ClémentPraudel1 17 janvier 2018 à 15:54:14

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          17 janvier 2018 à 16:13:57

          Est-ce que tu es sûr qu'après tes
          Response.Redirect("WebForm3.aspx");

          , le Page_Load de ton WebForm3 est bien appelé et exécute bien les fonctions que tu appelles ?

          Que te donne le debugger à ce niveau ?

          • Partager sur Facebook
          • Partager sur Twitter
            17 janvier 2018 à 16:26:44

            Je ne comprend pas trop ce que tu veux dire car le Response.Redirect est la fonction qui correspond au "OnClick" du bouton sur la page.

            Cette ligne de code, je l'ai utilisé juste pour faire afficher un message pour voir si ça fonctionnait : 

            protected void btn_final_validation_Click(object sender, EventArgs e)
                    {
                        Response.Redirect("WebForm3.aspx");
                    }

            Code Html du WebForm2 : 

            <div>
                            <asp:Button runat="server" ID="btn_final_validation" Text="Valider" OnClick="btn_final_validation_Click" />
                        </div>


            Code Html du WebForm3 :

            <body>
                <form id="form1" runat="server">
                    <div>
                        <h1>WELL DONE !!!!!</h1>
                    </div>
                </form>
            </body>

            C'est juste un test que je fais pour voir si la redirection se fait bien, et ça marche : 

            Ce n'est pas le code que je veux utiliser.

            Celui que je veux utiliser (et qui ne fonctionne pas pour passer de la page 2 à 3, alors que de la page 1 à 2 fonctionne avec quasiment le même code) est le suivant : 

            protected void btn_final_validation_Click(object sender, EventArgs e)
                    {
                        Response.Redirect("WebForm3.aspx");
                        foreach (GridViewRow row in gvResult.Rows)
                        {
            
                            CheckBox cb = (CheckBox)row.FindControl("FinalChk");
                            CheckBox cb2 = (CheckBox)row.FindControl("FinalChkForm");
            
                            if ((cb != null && cb.Checked) || (cb2 != null && cb2.Checked))
                            {
                                Server.Transfer("~/WebForm3.aspx");
                                //cb2.Visible = false;
                                //Response.Redirect("WebForm3.aspx");
                            }
                            else
                            {
                                //ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Veuillez sélectionner au moins un item')", true);
                                Page.ClientScript.RegisterStartupScript(this.GetType(), "Scripts", "<script>alert('Vous devez sélectionnere au moins 1 item.');</script>");
                            }
                        }
            
                        foreach (GridViewRow row in gvResultForm.Rows)
                        {
                            CheckBox cb = (CheckBox)row.FindControl("FinalChkForm2");
                            if (cb != null && cb.Checked)
                            {
                                Server.Transfer("~/WebForm3.aspx");
                            }
                        }
            
                        foreach (GridViewRow row in gvResultFormSelected.Rows)
                        {
                            CheckBox cb = (CheckBox)row.FindControl("FinalChk2");
                            if (cb != null && cb.Checked)
                            {
                                Server.Transfer("~/WebForm3.aspx");
                            }
                        }
                    }



            EDIT 18/01/2018 à 09:08 : 

            @BadMiscuit , Savez-vous ou pourrait venir le problème ?

            EDIT 18/01/2018 à 14:27 :

            e ne sais pas trop ce qui est le plus adapté à mon app web...

            Visiblement, le "Server.Transfer" a ses limites pour travailler sur plusieurs pages d'affilées. Pourtant, C'est bien du "Crossing Page Posting" que je fais avec le PreviousPage, mais la 2eme WebForm, n'est pas considéré comme une "page" au vu de l'URL qui dit que je suis resté sur le WebForm1 après le click bouton.

            Du coup, en cliquant sur le bouton de la WebForm2 pour envoyer les informations en résultat pour ma 3eme page, et bien, la page "n'existant" pas, je n'ai pas de donnée qui apparait...

            Je suis perdu là...

            Je ne sais plus comment procéder...

            J'ai trouvé ces sites qui parlent de la navigation mais rien ne me semble pertinent :

            https://www.codeproject.com/Articles/334867/Understanding-Page-Navigation-Techniques-in-ASP-NE

             http://www.c-sharpcorner.com/UploadFile/de41d6/navigation-techniques-in-Asp-Net/

            https://msdn.microsoft.com/en-us/library/540y83hx.aspx

             https://msdn.microsoft.com/en-us/library/6c3yckfw.aspx

            En terme de ControlState, j'ai besoin des lumières des plus talentueux :D

            -
            Edité par ClémentPraudel1 18 janvier 2018 à 14:30:39

            • Partager sur Facebook
            • Partager sur Twitter
              19 janvier 2018 à 9:58:06

              Bon, j'ai solutionner le problème de l'URL lorsqu'on charge les données sélectionnées de la 1ère à la 2ème page, en faisant du Cross Page Postback.

              J'ai enlevé la méthode OnClick de mon bouton, pour faire un 

              PostBackUrl="~/WebForm2.aspx"

              Dans le code behind du WebForm2, j'ai rajouté une condition : 

              if (Page.PreviousPage != null && Page.PreviousPage.IsCrossPagePostBack)

              Pour terminer, j'ai rajouter cette ligne dans mon aspx :

              <%@ PreviousPageType VirtualPath="~/WebForm1.aspx" %>

              (Je l'ai vu dans un tuto, donc je l'ai fait, mais je ne comprend pas trop le mécanisme de cette ligne...)

              Donc, j'ai le même résultat qu'auparavant, où les données sélectionnées vont bien basculées d'une page à une autre, et mes méthodes fonctionnent pour donner le résultat évoqué plus haut. De plus, j'ai la bonne URL quand je passe sur le WebForm2.

              Pour le WebForm3; il y a juste la ligne

              dt.Rows.Add("Test");

              qui s'alimente, et pas le foreach qui me permet de bind mon tableau...

              Voici le code-behind (Page_Load) du WebForm3 :

              protected void Page_Load(object sender, EventArgs e)
                      {
                          List<string> test_recup = new List<string>();
                          if (this.Page.PreviousPage != null && Page.PreviousPage.IsCrossPagePostBack)
                          {
                              GridView GridView1 = (GridView)this.Page.PreviousPage.FindControl("gvResult");
              
                              foreach (GridViewRow row in GridView1.Rows)
                              {
                                  if (row.RowType == DataControlRowType.DataRow)
                                  {
                                      CheckBox chkRow = (row.Cells[0].FindControl("FinalChk") as CheckBox);
                                      CheckBox chkRow2 = (row.Cells[2].FindControl("FinalChkForm") as CheckBox);
                                      if (chkRow.Checked)
                                      {
                                          string name = row.Cells[1].Text;
                                          test_recup.Add(name);
                                          System.Diagnostics.Debug.WriteLine("Template selected : " + name);
                                      }
                                  }
                              }
                          }
              
                          DataTable dt = new DataTable();
                          dt.Columns.Add("recup_template", typeof(string));
              
                          foreach (string s in test_recup)
                          {
                              dt.Rows.Add(s);
                              System.Diagnostics.Debug.WriteLine("test : " + s);
                          }
                          dt.Rows.Add("Test");
                          GridView1.DataSource = dt;
                          GridView1.DataBind();
                      }

              Il y a quelque chose qui m'échappe probablement... Peut-être qu'un œil neuf verra l'erreur !!! ;)




              • Partager sur Facebook
              • Partager sur Twitter
                19 janvier 2018 à 10:12:03

                Salut, à mon humble avis, un petit coup de debuggueur résoudra probablement la grande majorité de tes problèmes :)

                Un petit tuto ici https://msdn.microsoft.com/fr-fr/library/sc65sadd.aspx

                • Partager sur Facebook
                • Partager sur Twitter
                  19 janvier 2018 à 10:46:19

                  J'ai essayé et j'ai l'impression que le WebForm3 ne récupère aucune information provenant du WebForm2... Pourtant j'ai bien des informations qui s'affichent sur le WebForm2... @FooBar11

                  Help !!!!

                  -
                  Edité par ClémentPraudel1 19 janvier 2018 à 10:46:42

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Navigation de page en page

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown