c#
  • asp.net
  • 2009-02-04 11 views 0 likes 
    0

    J'ai un problème où j'ai une page avec une case à cocher:Pourquoi mes événements ne sont pas enregistrés après la publication?

    <asp:CheckBox runat="server" ID="chkSelectAll" OnCheckedChanged="chkSelectAll_CheckedChanged" EnableViewState="true" Text='<%# CommonFunctions.GetText(Page, "CreateTask", "chkSelectAll.text") %>' AutoPostBack="true" /> 
    

    D'abord, j'ai eu le problème que lorsque l'événement a été soulevée la case à cocher ne tenait pas la valeur de la propriété vérifiée. Ceci est encore étrange car nulle part dans l'application, nous définissons EnableViewState sur false et par défaut, il devrait être vrai. Eh bien ce comportement a été corrigé en mettant EnableViewState = "true".

    Alors maintenant, j'ai une case à cocher que lorsque je charge la page, wworks correctement. Je coche la case, l'événement est levé La valeur de la propriété Checked est bonne et la méthode est exécutée. La publication complète et affiche la page. Je coche la case à false, l'événement n'est pas déclenché et la page est rechargée avec les données précédentes mais la propriété Checked reste à true. Donc, après la première publication, je semble perdre le comportement de l'événement et ViewState.

    Nous soupçonnons le fait que l'on passe dynamiquement les contrôles dans la page (Voir la réponse here)

    Mais ce soupçon n'explique pas pourquoi tout fonctionne parfaitement après la première charge et cesse de fonctionner après la première publication.

    EDIT

    CODE SAMPLE

    J'ai créé un projet de test où vous pourrez découvrir mon problème. Au chargement, si vous cochez une case, les deux lèvent leur événement respectif. Après la publication, seule la seconde relance les deux événements. Je semble avoir un problème quand j'inscris les événements après le déplacement du contrôle.

    Répondre

    0

    J'ai une solution où Page_Load ne semble pas être le bon pour placer mon code en mouvement. Se déplacer à CreateChildControls semble avoir résoudre mon problème:

    protected override void CreateChildControls() 
    { 
        for (int i = 0; i < Controls.Count; i++) 
         if (Controls[i] is CollapsiblePanelExtender) 
          while (i + 2 < Controls.Count) 
          { 
           SearchUpdatePanel(Controls[i + 2]); 
           plhContent.Controls.Add(Controls[i + 2]); 
          } 
        base.CreateChildControls(); 
    } 
    

    Merci beaucoup tous ceux qui a essayé d'aider (pour cette instance Rob)

    4

    Il semble que vous écrasez les données de la case à cocher lors de la publication. Configurez vos commandes dynamiques dans la méthode qui gère l'événement de chargement de la page comme ceci:

    void Page_Load(){ 
        if (!Page.IsPostBack) 
        { 
         /* call methods to render a clean page with fresh controls */ 
        } 
    } 
    

    MISE À JOUR - après le code de l'échantillon a été publié

    j'avais raison, en principe, mais après avoir vu votre exemple de code Je suis mieux à même d'expliquer:

    Dans votre contrôle utilisateur, vous avez des méthodes appelées sur le chargement de la page qui doivent être dites si le contrôle est chargé ou non pour la première fois ou sur un post-retour - sinon, il continue à reconstruire une nouvelle copie du contrôle.

    Voici le code modifié à partir du fichier « CollapsiblePanel.ascx.cs »:

    protected void Page_Load(object sender, EventArgs e) 
        { 
         if (!Page.IsPostBack) 
         { 
          for (int i = 0; i < Controls.Count; i++) 
           if (Controls[i] is CollapsiblePanelExtender) 
            while (i + 2 < Controls.Count) 
            { 
             SearchUpdatePanel(Controls[i + 2]); 
             plhContent.Controls.Add(Controls[i + 2]); 
            } 
         } 
        } 
    

    Avec ce changement, la case à cocher tient sa valeur après la postback et votre événement est déclenché à chaque changement.

    +0

    C'est un endroit vraiment mauvais pour mettre la logique. Il est courant d'initialiser la page dans un if (!IsPostBack), mais la partie else vous encourage simplement à placer votre code de gestion d'événements directement dans la méthode de chargement de la page. –

    +0

    Non, le contrôle ne reçoit aucune donnée, la valeur par défaut est false, le texte est une donnée obligatoire, mais c'est du texte. Rien dans le pageload –

    +0

    @Ben - Je comprends vos préoccupations. Je voulais montrer les deux chemins de code possibles au cas où le lecteur ne serait pas familier avec l'utilisation. –

    Questions connexes