查找控件返回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。我在努力,但没有运气。我需要你的帮助。谢谢
对象引用未设置为对象的实例。
- 您必须将
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
。