2009-01-11 5 views
24

Comment accéder à un contrôle dans le LayoutTemplate d'un contrôle ListView? Je dois obtenir litControlTitle et définir son attribut Text.Accéder à un contrôle à l'intérieur d'un LayoutTemplate d'un ListView

<asp:ListView ID="lv" runat="server"> 
    <LayoutTemplate> 
    <asp:Literal ID="litControlTitle" runat="server" /> 
    <asp:PlaceHolder ID="itemPlaceHolder" runat="server" /> 
    </LayoutTemplate> 
    <ItemTemplate> 
    </ItemTemplate> 
</asp:ListView> 

Des pensées? Peut-être via l'événement OnLayoutCreated?

Répondre

36

Essayez ceci:

((Literal)lv.FindControl("litControlTitle")).Text = "Your text"; 
+0

Puis je suis venu ici. Merci quand même! – craigmoliver

+3

très étrange ... Je place ce code dans le rappel de OnLayoutCreated, et quand je lier le ListView il fonctionne bien ... – tanathos

+0

oh, eh bien je ne l'ai pas mis dans cet événement, en essayant maintenant – craigmoliver

18

La solution complète:

<asp:ListView ID="lv" OnLayoutCreated="OnLayoutCreated" runat="server"> 
    <LayoutTemplate> 
    <asp:Literal ID="lt_Title" runat="server" /> 
    <asp:PlaceHolder ID="itemPlaceHolder" runat="server" /> 
    </LayoutTemplate> 
    <ItemTemplate> 
    </ItemTemplate> 
</asp:ListView> 

En behind:

protected void OnLayoutCreated(object sender, EventArgs e) 
{ 
    (lv.FindControl("lt_Title") as Literal).Text = "Your text"; 
} 
+0

Cela fonctionne bien – Mahesh

+0

Cette solution est plus stable que celle de tanathos. Tanathos parfois ne fonctionne pas lorsque DataBind et l'accès dans la même méthode. – Gqqnbig

3

Cette technique fonctionne pour la mise en page du modèle; utiliser l'événement init du contrôle:

<asp:ListView ID="lv" runat="server" OnDataBound="lv_DataBound"> 
    <LayoutTemplate> 
    <asp:Literal ID="litControlTitle" runat="server" OnInit="litControlTitle_Init" /> 
    <asp:PlaceHolder ID="itemPlaceHolder" runat="server" /> 
    </LayoutTemplate> 
    <ItemTemplate> 
    </ItemTemplate> 
</asp:ListView> 

Et capturer une référence au contrôle pour une utilisation dans le code-behind (par exemple) dans le cas DataBound du ListView:

private Literal litControlTitle; 

protected void litControlTitle_Init(object sender, EventArgs e) 
{ 
    litControlTitle = (Literal) sender; 
} 

protected void lv_DataBound(object sender, EventArgs e) 
{ 
    litControlTitle.Text = "Title..."; 
} 
0

Pour Nested LV Loop: Je l'ai essayé au début, mais cela n'a pas fonctionné.

void lvSecondLevel_LayoutCreated(object sender, EventArgs e) 
{ 
    Literal litText = lvFirstLevel.FindControl("lvSecondLevel").FindControl("litText") as Literal; 
    litMainMenuText.Text = "This is test"; 
} 
Questions connexes