J'écris un composant WebControl composite personnalisé et je souhaite exposer les styles de contrôles enfants qu'il encapsule dans le concepteur ASP.NET. Le code que j'ai actuellement est similaire au squelette ci-dessous (qui, pour simplifier, n'a qu'un contrôle enfant).Comment exposer les propriétés de style de contrôle enfant dans un composant WebControl composite personnalisé
Avec le code ci-dessous, je peux voir la propriété "ChildPanelStyle" dans le concepteur, mais lorsque j'essaie de modifier l'une des propriétés (par exemple CssClass) dans le concepteur, il se réinitialise immédiatement à sa valeur par défaut. Il semble que la sérialisation du concepteur ne se passe pas.
Qu'est-ce que je fais mal?
MISE À JOUR
Ajout d'un setter pour la propriété de style ne contribue pas et ne devrait pas être nécessaire. J'ai mis à jour l'exemple avec une propriété de style supplémentaire gérée directement par le contrôle personnalisé, plutôt que d'être simplement la propriété d'un contrôle enfant.
La propriété HeaderStyle est persistée correctement par le concepteur, mais la propriété ChildPanelStyle ne l'est pas. Bien sûr, je peux gérer tous mes styles comme HeaderStyle, et les appliquer pendant le rendu, mais j'espère qu'il existe une solution plus simple par laquelle les contrôles enfants peuvent prendre soin d'eux-mêmes, et je n'ai pas besoin de rendu personnalisé.
public class MyControl : CompositeControl
{
Panel myChildPanel;
protected override void CreateChildControls()
{
myChildPanel = new Panel();
this.Controls.Add(myChildPanel);
}
[
Category("Style"),
Description("Child panel style"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
NotifyParentProperty(true),
PersistenceMode(PersistenceMode.InnerProperty),
]
public System.Web.UI.WebControls.Style ChildPanelStyle
{
get
{
EnsureChildControls();
return this.myChildPanel.ControlStyle;
}
}
[
Category("Style"),
Description("Header style"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
NotifyParentProperty(true),
PersistenceMode(PersistenceMode.InnerProperty),
]
public System.Web.UI.WebControls.Style HeaderStyle
{
get
{
if (_headerStyle == null)
{
_headerStyle = new Style();
if (IsTrackingViewState)
((IStateManager)_headerStyle).TrackViewState();
}
return _headerStyle;
}
}
private System.Web.UI.WebControls.Style _headerStyle;
// ... overrides for save/load/tracking ViewState omitted
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
EnsureChildControls();
base.Render(writer);
}
}
L'avez-vous résolu? Je crée un contrôle composite avec la même propriété de style pour le contrôle enfant interne. J'espère que vous pouvez partager votre code. – ajakblackgoat