Problème d'update panel

cs_Ethan Messages postés 23 Date d'inscription mardi 22 janvier 2002 Statut Membre Dernière intervention 16 novembre 2009 - 29 sept. 2009 à 13:28
JMPlus Messages postés 11 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 26 octobre 2009 - 25 oct. 2009 à 12:02
Bonjour à tous,

Je suis en charge d'un projet qui utilise une multitude de popup dont chaque popup est un UserControl.
J'essaie d'uniformiser toutes mes popups.
J'ai créé une classe BasePopupUsercontrol (qui hérite de UserControl) où

- Dans le OnInit, je viens ajouter un ModalPopupExtender un bouton, un panel ... et j'ajoute le panel du contrôle au ModalPopupExtender.

- Dans le OnPreRender, j'instancie les css au différents éléments du PopupControl.

Ca marche impeccablement à part quand dans le panel qui s'est ajouté au ModalPopupExtender il y a un UpdatePanel. J'obtiens l'erreur "Cannot unregister UpdatePanel with ID 'UpdatePanel1' since it was not registered with the ScriptManager. This might occur if the UpdatePanel was removed from the control tree and later added again, which is not supported. Parameter name: updatePanel]".

Je suis consciens que mon explication paraîot pas trop clair alors je laisse les sources :

BasePopupUserControl.cs

protected Panel PopupContent { get; set; }

        public abstract void SetPopupContentPanel();

        protected override void OnInit(EventArgs e)
        {
            if (ScriptManager.GetCurrent(Page) == null)
            {
                ScriptManager scp = new ScriptManager(); 
                Page.Controls.Add(scp);
            }

            base.OnInit(e);

            // Add control necessary to display modal
            this.Controls.Add(new ModalPopupExtender() { ID = "Popup" });
            this.Controls.Add(new Button() { ID = "FakeButton" });
            this.Controls.Add(new Panel() { ID = "BackgroundPanel" });
            this.FindControl("BackgroundPanel").Controls.Add(new Panel() { ID = "Footer" });
            this.FindControl("Footer").Controls.Add(new Button()
            {
                ID = "ButtonClosePopup",
                CssClass = "bigButton",
                Text = "Back to main page"
            });

            SetPopupContentPanel();

            ((Panel)this.FindControl("BackgroundPanel")).Controls.Add(this.PopupContent);

        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            // Hide Fake button (use to open modal popup in code behind
            ((Button)this.FindControl("FakeButton")).Style.Add("display", "none");

            // Set style to Popup
            ((Panel)this.FindControl("BackgroundPanel")).Style.Add("display", "none");
            ((Panel)this.FindControl("BackgroundPanel")).CssClass = "modalPopup";
            ((Panel)this.FindControl("Footer")).CssClass = "modalFooter";
            this.PopupContent.CssClass = "modalContent";

            // Initialize popup
            ModalPopupExtender popup = (ModalPopupExtender)this.FindControl("Popup");
            popup.PopupControlID = this.FindControl("BackgroundPanel").ID;
            popup.BackgroundCssClass = "modalBackground";
            popup.TargetControlID = this.FindControl("FakeButton").ID;
            popup.CancelControlID = this.FindControl("ButtonClosePopup").ID;
        }


        public void Show()
        {
            if (this.PopupContent == null)
                throw new NullReferenceException("PopupContent property cannot be null");

            ((Panel)this.FindControl("BackgroundPanel")).Style["display"] = "visible";
            if (this.FindControl(PopupContent.ID) == null)
            {
                this.FindControl("BackgroundPanel").Controls.Add(PopupContent);
            }

            ((ModalPopupExtender)this.FindControl("Popup")).Show();
        }



PopupEmail.aspx.cs

protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected override void Translate()
        {
            this.LinkButtonValidateAddMail.Text = Translator.Translate("ButtonUpdate");
        }

        protected override void FillValues()
        {
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            Session["IsEmail"] = true;
            this.Page.AutoPostBackControl = this.FindControl("ButtonClosePopup");
        }
        public override void SetPopupContentPanel()
        {
            this.PopupContent = Panel1;
        }

        protected void LinkButtonValidateAdd_Click(object sender, EventArgs e)
        {
        }


Et enfin la partie qui pose problème :
PopupEmail.aspx


    
        <ContentTemplate>
            
            

            

            
            
            
        </ContentTemplate>
    



Et là, j'ai l'erreur plus haut ...

Dans la page hôte du UserControl PopupEmail, il y a bien-sûr un script manager.

Si je mets pas d'updatepanel, quand je clique sur le LinkButton, la fenêtre se ferme. Alors qu'elle doit se fermer que si on clique sur le boutton ButtonClosePopup.

Quelqu'un peut solutionner le problème ?

Ethan

1 réponse

JMPlus Messages postés 11 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 26 octobre 2009
25 oct. 2009 à 12:02
Hello,

Je ne suis pas un expert, mais j'ai peut-être une piste suite à un problème que j'ai rencontré qui me semble assez proche.

En effet, j'avais un souci sur un usercontrol contenant un updatepanel qui disparaissait après validation.
En fait, le simple fait de cliquer sur un composant behind déclenche une réinitialisation(réaffichage) de l'updatepanel avec ses paramètres d'origine, ce qui remettait le div principal de mon usercontrol avec un display=none via mon CSS définit dans le design de celui-ci !
J'ai donc changé mon CSS et ce problème a été résolu.

Si je mets pas d'updatepanel, quand je clique sur le LinkButton, la fenêtre se ferme. Alors qu'elle doit se fermer que si on clique sur le boutton ButtonClosePopup.

Sans, ça doit même faire pire, non ? :)

Voilà, en espérant avoir apporté un petit élément de réflexion à défaut d'une solution...
0
Rejoignez-nous