0

我正在创建一个具有一系列 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”;

仍然没有骰子。

我怎样才能做到这一点?

4

5 回答 5

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>

然后在后面的代码中,您将使用数据绑定来设置数组等等。

于 2010-05-20T23:38:46.730 回答
0

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

连接调试器并检查 lb 实际上不是空的。

于 2010-05-20T23:38:09.087 回答
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;
}

然后,您可以将此容器或特定容器作为启动参数传递。

于 2010-05-20T23:40:45.960 回答
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) 
        };
    }
于 2010-05-20T23:44:12.380 回答
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...
}
于 2010-05-20T23:46:38.770 回答