2010-02-23 5 views
1

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); 
    } 

} 
+0

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

Répondre

1

Vous n'avez pas de setter. Malheureusement, vous ne pouvez pas définir directement this.myChildPanel.ControlStyle, car il s'agit d'une propriété en lecture seule. Vous devrez donc définir comme propriétés. Changer votre propriété ChildPanelStyle à ce qui suit:

[ 
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; 
    } 
    set 
    { 
     EnsureChildControls(); 
     this.myChildPanel.ControlStyle.BackColor = value.BackColor; 
     this.myChildPanel.ControlStyle.BorderColor = value.BorderColor; 
     this.myChildPanel.ControlStyle.BorderStyle = value.BorderStyle; 
     this.myChildPanel.ControlStyle.BorderWidth = value.BorderWidth; 
     this.myChildPanel.ControlStyle.CssClass = value.CssClass; 
     this.myChildPanel.ControlStyle.Font.Bold = value.Font.Bold; 
     this.myChildPanel.ControlStyle.Font.Italic = value.Font.Italic; 
     this.myChildPanel.ControlStyle.Font.Name = value.Font.Name; 
     this.myChildPanel.ControlStyle.Font.Names = value.Font.Names; 
     this.myChildPanel.ControlStyle.Font.Overline = value.Font.Overline; 
     this.myChildPanel.ControlStyle.Font.Size = value.Font.Size; 
     this.myChildPanel.ControlStyle.Font.Strikeout = value.Font.Strikeout; 
     this.myChildPanel.ControlStyle.Font.Underline = value.Font.Underline; 
     this.myChildPanel.ControlStyle.ForeColor = value.ForeColor; 
     this.myChildPanel.ControlStyle.Height = value.Height; 
     this.myChildPanel.ControlStyle.Width = value.Width; 
    } 
} 
+0

J'ai essayé d'ajouter un setter et cela n'a fait aucune différence - ce à quoi je m'attendais. J'ai mis à jour mon échantillon pour montrer un cas où un style géré directement par la propriété fonctionne bien dans le concepteur, sans un setter. – Joe

+0

BTW ne serait-il pas possible pour le setter de mettre à jour ControlStyl en utilisant quelque chose comme myChildPanel.ControlStyle.Reset(); myChildPanel.ControlStyle.MergeWith (valeur); – Joe

0

Si votre contrôle dérivé de System.Web.UI.Control (dont la plupart est probablement vrai selon simptoms), vous devez ajouter les attributs suivants pour obtenir ce que vous voulez:

[ParseChildren(true)] 
[PersistChildren(false)] 
public class MyControl : CompositeControl 
{ 
    ... 
} 

Ceci n'est pas nécessaire lors de la dérivation de WebControl.


PS vous n'avez pas besoin setter pour ... Les propriétés de style - mais assurez-vous ces styles sont vraiment créé lors de la première tentative de les obtenir.

Questions connexes