Bonjour,
J'ai une page a l'interieur de laquelle j'ai un usercontrol. J'aimerais pouvoir acceder a une ou plusieurs des methodes de ma page a partir de mon behind du usercontrol. Est-ce possible ?
Bonjour,
J'ai une page a l'interieur de laquelle j'ai un usercontrol. J'aimerais pouvoir acceder a une ou plusieurs des methodes de ma page a partir de mon behind du usercontrol. Est-ce possible ?
Tu peux acceder a une methode de ta page en realisant un cast de celle ci. Mais cela n'est pas tres conseillée car l'interet du web controle perd de tout son sens.
Sinon, tu peux declarer des handler et t'abonner dans ta apge a ces handler de ton user control.
tu peux jetter un coup d'oeil a cette discussion pour davantage de detail
http://www.developpez.net/forums/d67...-user-control/
Hum tout a fait, mais a moins que je ne me trompe tu me proposes l'inverse de ce que je veux faire![]()
mmhhh... non pas tout a fait...
En fait si tu accedes aux méthodes de ta page directement, tu brules une etape et donc ton webcontrol sera "liée" à cette page.
Si par contre, tu proposes un interface pour réaliser cet appel, alors chaque page pourra a son grée implementer cette interface pour en faire ce dont bon lui semble.
Hum euh j'avoue ne pas trop comprendre ce aue tu veux dire par interface.
Un exemple vaut mieux qu une longue explication :
Voici un repeater qui contient des web controles messages a afficher.
Chaque message a afficher possede un fonction delete. Or chaque effacement devra amener le repeater a se rafraichir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <asp:Repeater runat=server ID=C_Rep_MessageList DataSource="<%# DataSource %>" OnItemDataBound=C_Rep_MessageList_ItemDataBound> <HeaderTemplate> <table class="list_messages"> </HeaderTemplate> <ItemTemplate> <asp:PlaceHolder runat=server ID=C_PH_Message> </asp:PlaceHolder> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater>
code behind du repeater ou je charge dynamiquement mes controles en focntion de certains parametres:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 protected void C_Rep_MessageList_ItemDataBound(object sender, RepeaterItemEventArgs e) { Message m = null; PlaceHolder ph = null; WebMessage uc = null; m = (Message)e.Item.DataItem; ph = (PlaceHolder)e.Item.FindControl("C_PH_Message"); if (m != null) { switch (m.MessageType) { case Message.E_MessageType.PrivateMessage: if (m.Recipient.UserName == CurrentUser.Account.UserName) { uc = (WebMessage)LoadControl("MessageBox/BasicIncomingMessage.ascx"); } } //load the message uc.MessageToDisplay = m; // abonnement à l'evenement on delete du user control message uc.OnDeleteClick += new EventHandler(DeleteClick); //type of display for this message uc.DisplayType = this.DisplayType; //We databind the message to display it uc.DataBind(); //we add to the list of controls the place holder has. ph.Controls.Add(uc); } }
et ensuite chaque web controle possede le code behind suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public event EventHandler OnDeleteClick; protected void DeleteClick(EventArgs e) { if (OnDeleteClick != null) { OnDeleteClick(this, e); } } public void DeleteMessage(object sender, EventArgs e) { //this really delete the message CurrentUser.Account.Messages.DeleteMessage(CurrentUser, _MessageToDisplay); DeleteClick(e); }
Comme tu peux le constater dans mon web control j'appelle :
Ceci va aller chercher le deleteclick de la page qui contient ce controle grace à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part DeleteClick(e);
Et donc rafraichir ma page:
Code : Sélectionner tout - Visualiser dans une fenêtre à part uc.OnDeleteClick += new EventHandler(DeleteClick);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 /// <summary> /// reload the list after a deletion /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void DeleteClick(object sender, EventArgs e) { C_Rep_MessageList.DataBind(); }
Partager