查找控件返回Null

本文关键字:Null 返回 控件 查找 | 更新日期: 2023-09-27 17:54:32

我有一个在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。我在努力,但没有运气。我需要你的帮助。谢谢

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

查找控件返回Null

  • 您必须将FindControl与分配的Id一起使用,因为您使用的是连续编号,所以必须使用该编号而不是"imgbtn"
  • 你必须在NamingContainer上使用FindControl——控制你正在搜索的内容。您正在控件本身上使用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