1

我为页面控件编写了一个小扩展方法,以递归搜索控件。但我得到“对象引用未设置为对象的实例”异常。

似乎 page.Controls 只有 1 个控件,在这个控件上我设置了这个异常。

有人有什么想法吗?

这是代码:

public static Control FindControlRecursive(this Page page, string id)
        {
            return Execute(page, id);
        }

 private static Control Execute(Control root, string id)
        {
            if (root.ID.Equals(id))
                return root;
              ControlCollection  controls = root.Controls;

            foreach (Control ctrl in controls)
            {
                Control FoundControl = Execute(ctrl, id);
                if (FoundControl != null)
                    return FoundControl;
            }
            return null;
        }
    }

更新 现在我有另一个错误:发生错误:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引...

但这一个在循环中间的某个地方抛出。

4

2 回答 2

1

这一行有一个可能的原因:

if (root.ID.Equals(id))

不需要为树中的所有控件设置 ID 属性。我什至怀疑 Page 本身是否不为空。尝试将此行替换为以下内容:

if (string.Equals(root.ID, id))
于 2012-08-03T12:10:43.493 回答
1

在我看来, ID 可以为空,并且 ID.Equals() 正在引发异常。尝试换行

if (root.ID.Equals(id))
    return root;

 if (!string.IsNullOrEmpty(root.ID) && root.ID.Equals(id))
        return root;
于 2012-08-03T12:13:39.967 回答