0

我已经在我的*.aspx页面中定义了 html 表而不是 asp-tags 之一。然后我在该表的行中添加了一些 asp 控件:<asp:CheckBox>.

我已经定义了很多复选框,因为我需要为用户提供大量的选择并且我不能最小化复选框的数量。

CodeBehind我想枚举整个控件以查找我需要的内容GetType().Name,然后将其添加到临时列表中以供将来操作。

但是我遇到了麻烦,在调试器中我看不到任何复选框,并且控件的数量非常少。

我正在枚举页面中的控件,如下所示:

foreach (var item in Page.Controls)
{
    if (item.GetType().Name == "CheckBox")
    {
         CheckBox checkBox = item as CheckBox;

         if (checkBox.ID != null && checkBox.ID != String.Empty && checkBox.Checked)
         {
             arrayDocs.Add(checkBox.ID);
         }
    }
}

我的页面的完整代码:

aspx: http: //pastebin.com/gUs2LchL

背后的代码:http: //pastebin.com/5tfnKJSt

4

1 回答 1

0

根据MSDN ,Control.Controls 属性返回该控件的控件的集合,而不是后代。只有直接包含在该控件中的服务器端控件才会成为集合的一部分。

如果您想在页面上构建所有控件的集合,您将需要递归地循环遍历控件以添加它们的子控件等等 - 正如 Magnus 正确说明的那样。

最有效/最有效的方法是从复选框的父容器构建集合,在本例中是 HtmlTable“tableDocs”的单元格。

改变-

foreach (var item in Page.Controls)

至-

foreach (var item in tableDocs.Controls)

然后,在到达复选框之前,您需要将子控件递归循环到至少两个级别(行 -> 单元格 -> 复选框)。

可能更直接的方法是使用泛型并创建一个类型化的 CheckBox 列表,其中包含您希望测试的所有复选框。

就像是-

var checkboxes = new List<CheckBox>{checkboxAuctionHistory, checkboxBackSaldo, checkboxBalanceDecrypted}; //And so on

    foreach (var checkbox in checkboxes)
    {
        if (!string.IsNullOrWhiteSpace(checkbox.ID) && checkbox.Checked)
            {
                arrayDocs.Add(checkbox.ID);
            }
        }
    } 

这有一个明显的缺陷,即每次向表单添加新复选框时都需要记住更改列表。

或者将复选框移出表或从中删除 runat="server" 属性,从 ASP.NET 控件树中删除表,并使复选框的容器为“form1”。

页面上的大多数其他标记都没有 runat="server",因此这些元素不是 ASP.NET 控件树的一部分。

于 2013-05-12T19:40:44.363 回答