查找控件返回Null

时间:2015-06-08 08:11:26

标签: c# asp.net controls imagebutton findcontrol

我有一个在 pnRoom (面板)

中动态添加的控件
 ImageButton imgbtn = new ImageButton();
 imgbtn = new ImageButton();
 imgbtn.Height = 25;
 imgbtn.CssClass = "bulb";
 imgbtn.ID = i++;
 pnRoom.Controls.Add(imgbtn);

在找到控件 imgbtn

时,我收到 null
 protected void LoadBulb()
    {           
            foreach (Control c in pnRoom.Controls)
            {
                ImageButton img = (ImageButton)c.FindControl("imgbtn");
                img.ImageUrl = "~/path/images/bulb_yellow_32x32.png";
            }
    }

它总是返回null。我尝试但没有运气。我需要你的帮助。谢谢!!!

  

对象引用未设置为对象的实例。

1 个答案:

答案 0 :(得分:2)

  • 您必须使用FindControl与已分配的Id,因为您使用的是连续号码,而不是"imgbtn"
  • 您必须在FindControl上使用NamingContainer - 您正在搜索的内容。您在控件本身上使用FindControl
  • 如果您在面板上使用循环,则会获得所有控件(非递归),因此您根本不需要使用FindControl。您想要所有ImageButton,您可以使用Enumerable.OfType

    foreach(var img in  pnRoom.Controls.OfType<ImageButton>())
    {
         img.ImageUrl = "~/path/images/bulb_yellow_32x32.png";
    }
    

如果您不想接受所有ImageButton,或者您担心以后会有其他ImageButton个您想要的要省略,更好的方法是给它们一个有意义的前缀,并通过String.StartsWith进行过滤。

假设你已经给了他们所有imgbtn_(并且跟随一个数字):

var imgBtns = pnRoom.Controls.OfType<ImageButton>().Where(i => i.ID.StartsWith("imgbtn_"));
foreach(var img in  imgBtns)
{
    // ...
}

如果尚未添加using System.Linq,请务必添加。{/ p>