FindControl (ImageButton) inside a ListView
本文关键字:ListView inside ImageButton FindControl | 更新日期: 2023-09-27 18:06:18
我希望有人能帮助我。我无法在ListView中找到ImageButton控件,它总是给我对象引用,而不是设置为对象错误的实例。
这个场景是,如果我选中了复选框,我希望imagebutton改变它的"图像"。复选框不驻留在listviewitemtemplate中。下面是我为checkbox_checkchanged事件编写的代码:
if (cb.Checked)
{
foreach (Control c in lv.Controls)
{
ImageButton btndel = (ImageButton)c.FindControl("btnDelete");
btndel.ImageUrl = "~/images/activate.png";
}
}
注意:我使用ForEach循环认为btnDelete按钮在我的Listview中出现了几次
如果复选框在ListView之外,最好的方法是使用ListView的ItemCreated-Event:
protected void LV_ItemCreated(object sender, ListViewItemEventArgs e)
{
// Retrieve the current item.
ListViewItem item = e.Item;
// Verify if the item is a data item.
if (item.ItemType == ListViewItemType.DataItem && cb.Checked)
{
ImageButton btndel = (ImageButton)item.FindControl("btnDelete");
btndel.ImageUrl = "~/images/activate.png";
}
}
你不需要处理Checkbox' CheckedChanged-Event,只需要在你的aspx标记上添加OnItemCreated-handler:
<asp:ListView ID="LV" OnItemCreated="LV_ItemCreated" ... />
这样可以防止ListView-Items的多次迭代。无论如何,ItemCreated都会在每次回发时被隐式调用,以重新创建ListView-Items。
在强制转换之前,您应该检查FindControl的结果是否为null或类型是否正确。
试着在c
对象的Controls中调用FindControl因为它可能是你要寻找的控件在更低的嵌套层中(在ListViewItem中)实际上,你可以在lv.Items
中循环并在那里执行FindControl。
For each (ListViewDataItem c in lv.items)...