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;
        }
    }

Update Now 別のエラーが発生しました: エラーが発生しました: インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。パラメータ名:index ...

しかし、これはループの途中でスローされます。

4

2 に答える 2

1

ID が null になる可能性があり、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 に答える
1

この行には、考えられる原因が 1 つあります。

if (root.ID.Equals(id))

ツリー内のすべてのコントロールに ID プロパティを設定する必要はありません。Page自体がnullでないかどうかさえ疑問です。この行を次のように置き換えてみてください。

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