0

WebControl我有以下方法在我的助手类中返回一个列表:

public static List<T> GetControls<T>(ControlCollection cCol) where T : WebControl
{
    List<T> results = new List<T>();
    foreach (Control control in cCol)
    {
        if (control is T)
            results.Add((T)control);

        if (control.HasControls())
            GetControls<T>(control.Controls);
    }
    return results;
}

在我的 aspx 页面上有一个包含 3 个asp:CheckBoxList控件的 UpdatePanel。为了填充我的列表,我使用上述方法,其中CheckBoxPanel包含我的控件的 UpdatePanel。

List<CheckBoxList> cbCol = Helper.GetControls<CheckBoxList>(CheckBoxPanel.Controls);

此行返回 0 个结果,这表明我的方法GetControls<T>(ControlCollection cCol)是错误的。

请帮助我找到思路中的缺陷。

4

2 回答 2

1

results是一个局部变量。因此,对于每个递归调用,您添加一些控件并忘记它。

它应该在所有递归调用中作为参数传递,只有这样控件才会填充到同一个列表中。

未经测试,但以下代码应该可以工作:

private static List<T> GetControls<T>(ControlCollection cCol, List<T> results) where T : WebControl
{
    foreach (Control control in cCol)
    {
        if (control is T)
            results.Add((T)control);
        if (control.HasControls())
            GetControls<T>(control.Controls, results);
    }

    return results;
}

public static List<T> GetControls<T>(ControlCollection cCol) where T : WebControl
{
    return GetControls(cCol, new List<T>());
}
于 2014-10-23T06:13:52.217 回答
0

您可以使用 Snram 解决方案,或者只是简单地:

if (control.HasControls())
            results.AddRange(GetControls<T>(control.Controls));

您唯一需要的是将递归调用输出添加到结果中。

Snram解决方案可能会更好,因为您不会在每次递归调用时创建列表实例(在我的解决方案中,GC 必须处理未使用的列表并将其从内存中删除)。

于 2014-10-23T06:26:26.680 回答