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

实际上,我正在使用ASP.NET和C#开发一个Web模板。 我在usercontrol页面中有一个listview ,在ItemTemplate里面我有一个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页面后面的代码中找到这个控件。 感谢您的考虑。

ListView通常包含多个项目,因此Placeholder的NamingContainer (由FindControl搜索)既不是UserControl,也不是ListView本身。 它是ListViewItem对象。 所以找到引用的地方是ListView的ItemDataBound事件 。

 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,然后在ListViewItem上使用FindControl

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

正如Tim Schmelter所提到的,您也可以通过迭代ListView来访问您的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; } }