来自UserControl的FindControl()在for循环中

时间:2010-05-20 23:32:00

标签: .net user-controls for-loop findcontrol

我正在创建一个具有一系列LinkBut​​tons的用户控件。

我已将所有链接按钮声明为班级

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”;

仍然没有骰子。

我该怎么做?

5 个答案:

答案 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)

它肯定能找到LinkBut​​ton吗?在我看来,FindControl实际上并没有找到LinkBut​​ton。

连接调试器并检查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..

然后,只要您需要访问所有LinkBut​​ton控件,就可以轻松遍历List:

foreach (var item in linkButtonList)
{
    // do something with the LinkButton here...
}