ListView中的FindControl(ImageButton)

时间:2011-08-22 21:55:23

标签: c# asp.net

我希望有人可以帮助我。我无法在ListView中找到ImageButton控件,它总是给我对象引用未设置为对象的实例错误。

情况是,如果我选中了复选框,我希望图像按钮更改其图像。 Checkbox不驻留在Listview ItemTemplate中。这是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中出现过几次。

3 个答案:

答案 0 :(得分:1)

如果Checkbox不在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。

答案 1 :(得分:0)

在转换之前,你应该检查FindControl的结果是否为null或者是否是正确的类型。

尝试在c对象的控件中调用FindControl,因为它可能是你正在寻找的控件再下一层嵌套(所以在ListViewItem中),实际上,你可以在lv.Items并在那里做一个FindControl ......

答案 2 :(得分:0)

For each (ListViewDataItem c in lv.items)...