3

我有一个包含 5 个用户控件的页面。我想用它们做更多的事情,但现在,我只想用下面的方法来计算它们。

void btnFormSave_Click(object sender, EventArgs e)
{
  int i = 0;
  ControlCollection collection = Page.Controls;
  foreach (Control ctr in collection)
  {
    if (ctr is UserControl)
    {
      i++;
    }
   }
}

当我调试这段代码时,i = 1,并且控件是母版页(我不知道母版页是用户控件)。

如何计算页面上的用户控件?

编辑

这是我的内容占位符标记。

<asp:Content ID="cntMain" runat="Server" ContentPlaceHolderID="ContentMain">
4

2 回答 2

1

您只需要更改查找的位置:

void btnFormSave_Click(object sender, EventArgs e)
{
  int i = 0;
  // here, look inside the form, and not on page.
  ControlCollection collection = Page.Form.Controls;
  foreach (Control ctr in collection)
  {
    if (ctr is UserControl)
    {
      i++;
    }
   }
}

我已经测试并为我工作。

于 2013-01-31T20:42:41.623 回答
1

编辑:用以下内容替换我原来的、偏离基础的答案。

您可能需要递归到控件内的控件(可能进入面板?)。

http://msdn.microsoft.com/en-us/library/yt340bh4(v=vs.100).aspx

此示例仅查找 Page 对象中包含的控件以及作为页面的直接子级的控件。它不会找到作为控件子级的文本框,而该控件又是页面的子级。例如,如果您将 Panel 控件添加到页面,则 Panel 控件将是 Page 包含的 HtmlForm 控件的子控件,并且可以在此示例中找到。但是,如果您随后将 TextBox 控件添加到 Panel 控件中,则该示例将不会显示 TextBox 控件文本,因为它不是页面的子级或作为页面子级的控件的子级。以这种方式遍历控件的一个更实际的应用是创建一个递归方法,可以调用该方法来遍历遇到的每个控件的 Controls 集合。

编辑 2:在 SO 上添加指向递归控制搜索示例的链接。

使用 LINQ 的示例:https ://stackoverflow.com/a/253962/704808

传统示例:https ://stackoverflow.com/a/4955836/704808

于 2013-01-31T20:28:55.080 回答