2009-10-16 7 views
4

Je suis en train de réaliser quelque chose le long des lignes de ...UserControl avec contrôles enfants passés dans un répéteur dans le UserControl

UserControl (MyRepeater)

<p>Control Start</p> 
    <asp:Repeater id="myRepeater" runat="server" /> 
<p>Control End</p> 

page

<p>Page Start</p> 
<uc1:MyRepeater ID="MyRepeater1" runat="server"> 
    <ItemTemplate> 
     <p>Page Item Template</p> 
    </ItemTemplate> 
</uc1:MyRepeater> 
<p>Page End</p> 

Le ItemTemplate de l'objet Page sera utilisé en tant que ItemTemplate du Répéteur dans UserControl.

La raison en est que nous utilisons un certain nombre de répéteurs dans toute notre application, chaque répéteur et certains boutons correspondants effectuent un code similaire. Je souhaite conserver ce code au même endroit afin que les développeurs puissent utiliser notre contrôle Repeater personnalisé plutôt que de devoir créer le code dans chaque page chaque fois que cela est nécessaire.

Je l'ai fait par le passé avec un WebControl en créant un contrôle Repeater dans la méthode RenderContents de mon contrôle Repeater et tout fonctionne comme je l'attendrais.

La raison pour laquelle je voudrais utiliser un UserControl car il y aura un certain nombre de changements de style/type de mise en page qui peuvent être nécessaires entre les systèmes, ce sera beaucoup plus facile comme un UserControl où le html/asp peut être édité directement.

Actuellement, le code derrière mon UserControl ressemble à ceci.

[ParseChildren(false)] 
[PersistChildren(true)] 
public partial class MyRepeater : System.Web.UI.UserControl, INamingContainer 
{ 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     myRepeater.ItemTemplate = this.ItemTemplate; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Temporary bind for testing 
     myRepeater.DataSource = Enumerable.Range(1, 5); 
     myRepeater.DataBind(); 
    } 

    [DefaultValue("")] 
    [Browsable(false)] 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateContainer(typeof(RepeaterItem))] 
    public virtual ITemplate ItemTemplate { get; set; } 
} 

En bref, il est tout simplement pas travailler ... Le contenu de la page ItemTemplate sont rendus après l'ensemble UserControl et non dans le répéteur. Est-ce que quelqu'un peut indiquer où je peux aller mal et/ou me diriger dans une meilleure direction?

+0

pourrait-il faire avec le cycle de vie? Page_Init dans le contrôle sera exécuté avant le Page_Init de la page - myRepeater.ItemTemplate est-il défini? –

+0

Ce n'est pas, je viens de trouver le problème exact. this.ItemTemplate dans le Page_Init est null. En fait, il semble toujours être nul. Je ne suis pas sûr où je peux le choisir pour l'utiliser car il n'a pas encore été rendu. –

Répondre

4

Vous avez l'analyse et persistez dans le mauvais sens.

Vous voulez

[ParseChildren(true)] 
[PersistChildren(false)] 
+0

Quel numpty ... oui ... c'était exactement ça. Merci! –

Questions connexes