如何从usercontrol页面后面的代码中找到ListView的ItemTemplate中的控件?

时间:2012-02-09 09:48:06

标签: c# asp.net placeholder user-controls

实际上,我正在使用ASP.NET和C#开发Web模板。 我在listview页面中有usercontrolItemTemplate内有PlaceHolder,如下所示:

<asp:PlaceHolder ID="ph_Lv_EditModule" runat="server">  </asp:PlaceHolder>

我想从后面的代码访问此PlaceHolder,我使用了不同的方法,但我无法访问它。

PlaceHolder ph_Lv_EditModule = (PlaceHolder)lv_Uc_Module.FindControl("ph_Lv_EditModule");

PlaceHolder ph_Lv_EditModule = (PlaceHolder)this.lv_Uc_Module.FindControl("ph_Lv_EditModule");

你可以帮我找一下如何在我的usercontrol页面后面的代码中找到这个控件。 感谢您的考虑。

2 个答案:

答案 0 :(得分:8)

ListView通常包含多个项目,因此占位符的NamingContainer(由FindControl搜索)既不是UserControl,也不是ListView本身。这是ListViewItem对象。所以找到参考的地方是ListView's ItemDataBound event

protected void ListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        var ph_Lv_EditModule = (PlaceHolder)e.Item.FindControl("ph_Lv_EditModule");
    }
}

如果您需要在其他地方使用引用,则必须迭代ListView的Items,然后在FindControl上使用ListViewItem

顺便说一句,这与GridView或Repeater等其他DataBound控件的行为相同。

答案 1 :(得分:0)

正如Tim Schmelter所提到的,您也可以通过迭代ListView来访问您的控件,如下所示

private void HideMyEditModule()
{
    foreach (var item in lv_Uc_Module.Items)
    {
        PlaceHolder holder = item.FindControl("ph_Lv_EditModule") as PlaceHolder;
        if (holder!= null)
            holder.Visible = false;
    }
}