Question

Dans mon propre contrôle du serveur, je voudrais mettre en œuvre quelque chose de similaire à la ListView:

<asp:ListView runat="server">
    <LayoutTemplate>
        <asp:PlaceHolder runat="server" id="itemPlaceholder" />
    </LayoutTemplate>
</asp:ListView>

J'ai créé une propriété ITemplate, je peux définir la mise en page dans la page ASPX, et je fais ITemplate.InstantiateIn(myControl).

Mais je ne peux pas comprendre comment insérer des contrôles dans l'espace réservé. Je suppose que ce serait quelque chose comme MyTemplate.FindControl("itemPlaceholder").Controls.Add(myControl). J'ai essayé de coulée du type de mon ITemplate, mais je reçois l'erreur:

Unable to cast object of type 'System.Web.UI.CompiledTemplateBuilder' to type 'MyNamespace.MyLayoutTemplate'

Qu'est-ce que je manque?

Modifier Je viens de trouver ceci: http: //www.nikhilk. net / SingleInstanceTemplates.aspx Control developers can define templates to be single instance using metadata which causes the ID'd controls within the template contents to be promoted to the page level... The parser and code-generator together work behind the scenes to add member fields, and initialize them at the right time.. Il semble que pour les contrôles utilisateur? J'ai essayé Page.FindControl() après avoir fait cela, mais il ne trouve rien.

Était-ce utile?

La solution

Ok, cela était tout simplement une question d'erreur utilisateur . J'instancié le ITemplate dans un Panel, donc évidemment Page.FindControl() (ce qui est récursive) ne fonctionnerait pas. Une fois que je l'ai fait Panel.FindControl(), tout fonctionnait.

Autres conseils

Dans le passé, je l'ai utilisé cette bibliothèque sucess http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top