我有一个在 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。我尝试但没有运气。我需要你的帮助。谢谢!!!
对象引用未设置为对象的实例。
答案 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>