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中出现了几次

FindControl (ImageButton) inside a 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)...