Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

user web control avec template

3 réponses
Avatar
Thierry Schembri
Excusez mon précédent message, mais mon lecteur de news a posté avant
que j'aie eu le temps de terminer !

Bonjour,

Je suis confronté au probleme suivant :

Je voudrais faire un user web control qui en fait "habillerait" un
contenu qui pourrait être libre. Je procède ainsi :


1) Je crée donc un web control qui contient seulement le code html
suivant (c'est un exemple) :

<hr>
<asp:PlaceHolder id="contenu" runat="server" />
<hr>

Le contenu "libre" sera placé dans le place holder.

2) J'associe le code suivant à ce controle :

private ITemplate content = null;

[TemplateContainer(typeof(MessageContainer))]
public ITemplate Content
{
get { return content; }
set { content = value; }
}

void Page_Init()
{
if (content != null)
{
MessageContainer container = new MessageContainer(0);
content.InstantiateIn(container);
contenu.Controls.Add(container);
}
}

public class MessageContainer : Control, INamingContainer
{
private int index;
internal MessageContainer(int index) { this.index = index; }
public int Index { get { return index; } }
}

3) Je place mon controle sur une nouvelle page :

<uc1:toto>
<Contenu>
<asp:Label id="label" runat="server" text="tagada" />
</Contenu>
</uc1:toto>

4) Je compile, je lance. J'obtiens bien à l'écran la chaine "tagada"
insérée dans mon user control (en l'occurence entre deux <hr>).

5) Là, ca se corse, je voudrais, dans le code de ma page faire :
label.Text = "pouet"

hélas, ça ne marche pas, j'obtiens "The name 'label' does not exist in
the current context.

Ma question : comment faire pour acceder à partir de la page contenant
le user control aux controles se trouvant dans sa zone "libre" ?

Merci d'avance (d'avoir lu un si long message et de m'aider).
Thierry

3 réponses

Avatar
Franck Quintana
Bonjour,
Votre contrôle ressemble au Repeater d'Asp.net.
N'est il pas possible dans le contexte de votre application d'attacher
les données de la même façon ?
C'est à dire soit en utilisant :

<uc1:toto>
<Contenu>
<asp:Label id="label" runat="server" text='<%#
DataBinder.Eval(Container.DataItem, "MaPropriété") %>' />
</Contenu>
</uc1:toto>

Soit en souscrivant a un évènement OnItemDataBound.
Et a l'intérieur de celui-ci écrire :

Label oLbl = e.Item.FindControl("label") as Label;
if (oLbl != null)
oLbl.Text = "pouet";


Enfin je vous renvoie à cet excellent article de Scott Mitchell qui
traite en profondeur ce type de contrôle.
http://msdn.microsoft.com/asp.net/default.aspx?pull=/library/en-us/dnaspp/html/ASPNet-BuildTemplatedSrvrCntrls.asp

Franck Quintana
Active+ Software
http://www.activeplus.com
Avatar
Thierry Schembri
Merci du renseignement, je vais étudier cet article de près (on est rarement
déçu d'un article de Scott Mitchell ;-))
Avatar
Franck Quintana
Entièrement d'accord avec vous :)

Franck Quintana
Active+ Software
http://www.activeplus.com