cs_Ethan
Messages postés23Date d'inscriptionmardi 22 janvier 2002StatutMembreDernière intervention16 novembre 2009
-
29 sept. 2009 à 13:28
JMPlus
Messages postés11Date d'inscriptionmercredi 23 novembre 2005StatutMembreDernière intervention26 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();
}
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.
JMPlus
Messages postés11Date d'inscriptionmercredi 23 novembre 2005StatutMembreDernière intervention26 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...