我正在创建一个具有一系列LinkButtons的用户控件。
我已将所有链接按钮声明为班级
LinkButton LB1 = new LinkButton();
LinkButton LB2 = new LinkButton();
//...
LinkButton LB9 = new LinkButton();
现在我希望能够创建一个循环来访问所有这些链接按钮,所以我不必每次都写出来。
我在覆盖的CreateChildControls()方法中尝试了类似的东西:
for (int i = 1; i < 10; i++)
{
LinkButton lb = (LinkButton)FindControl("LB" + i.ToString());
lb.Text = i.ToString() + "-Button";
}
我一直得到一个例外,说lb.Text ...没有设置为对象的实例。
我也试过给我所有的LB1,LB2等有效的ID。
即:LB1.ID =“LB1”;
仍然没有骰子。
我该怎么做?
答案 0 :(得分:1)
FindControl
仅在将这些控件添加到Controls
集合后才有效,并且仅在OnInit
方法中发生。所以你得到一个例外,因为LB1,LB2等控件尚未添加到Controls集合中,而FindControl正在返回null
。
您可以使用List<LinkButton>
的一种方法,然后在Init
事件处理程序中,将控件添加到列表中。
另一种方法是,您可以使用LINQ循环遍历子控件:
var ctrls = Controls.OfType<LinkButton>();
此版本将返回所有 LinkButton
控件,因此我不确定这是否正是您想要的。同样,这只适用于Init
事件或页面周期的后期。
<强>另外强>
根据您的网页结构,您可能最好使用Repeater控件。在你的.aspx / ascx文件中有这样的东西:
<asp:Repeater ID="repeater" runat="server">
<ItemTemplate>
<asp:LinkButton ID="btn" runat="server" />
</ItemTemplate>
</asp:Repeater>
然后在你的代码中,你将使用数据绑定来设置数组等等。
答案 1 :(得分:0)
它肯定能找到LinkButton吗?在我看来,FindControl实际上并没有找到LinkButton。
连接调试器并检查lb实际上是否为空。
答案 2 :(得分:0)
我认为FindControl只返回一个直接容器中的控件,所以如果你把它们放在说DIV元素或表中,那么它就找不到它们。您可以使用类似于以下内容的辅助函数:
public static Control FindControl(Control start, string id)
{
Control foundControl;
if (start != null)
{
foundControl = start.FindControl(id);
if (foundControl != null)
return foundControl;
foreach (Control c in start.Controls)
{
foundControl = FindControl(c, id);
if (foundControl != null)
return foundControl;
}
}
return null;
}
然后,您可以将此特定容器或特定容器作为起始参数传递。
答案 3 :(得分:0)
这样的事情:
int btnCount = 10;
LinkButton[] btns = new LinkButton[btnCount];
for (int i = 1; i <= btnCount; i++)
{
btns[i - 1] = new LinkButton(){
Text = string.Format("{0} - Button", i)
};
}
答案 4 :(得分:0)
正如@Alek和@codeka所提到的,FindControl只有在将它们添加到容器(例如Page对象)后才能工作。
你可以做的不是将每个声明为变量,而是将它们添加到List中,如下所示:
var linkButtonList = new List<LinkButton>();
linkButtonList.Add(new LinkButton());
linkButtonList.Add(new LinkButton());
etc..
然后,只要您需要访问所有LinkButton控件,就可以轻松遍历List:
foreach (var item in linkButtonList)
{
// do something with the LinkButton here...
}