4

コード例:

    var div = new HtmlGenericControl("div");
    div.Controls.Add(new Literal() { ID = "litSomeLit" });
    var lit = (Literal)div.FindControl("litSomeLit");
    Assert.IsNotNull(lit);

lit が null であるため、このコードはアサートに失敗します。デバッグすると、div.Controls には ID が "litSomeLit" のリテラルが確実に含まれていることがわかります。私の質問は「なぜ?」および「一度に 1 つの要素を手動で div.Controls[] を再​​帰的に検索せずに、特定の ID のコントロールを取得する方法はありますか?」

私がこのようにやっている理由は、私の実際のアプリケーションがそれほど単純ではないからです。私が書いているメソッドには、いくつかの可能な構成でいくつかのサブコントロールを持つ複雑なコントロールが与えられています。特定のコントロールに数層下にアクセスする必要があります (たとえば、ID が "txtSpecificControl" のコントロールは にありますStartingControl.Controls[0].Controls[2].Controls[1].Controls[3])。通常はFindControl("txtSpecificControl").

4

3 に答える 3

4

私が知る限り、ページにコントロールを追加せずに、私が達成しようとしていることを実行する方法はありません。推測しなければならない場合、FindControlはコントロールのUniqueIDプロパティを使用します。これには通常、現在のコントロールより上のすべてのコントロールのIDが含まれます(例:OuterControlID $ LowerControlId $ TargetControlID)。これは、コントロールが実際にページに追加されたときにのみ生成されます。

とにかく、これは、コントロールがまだページにアタッチされていないときに機能する再帰的な深さ優先探索FindControlの実装です。

    public static Control FindControl(Control parent, string id)
    {
        foreach (Control control in parent.Controls)
        {
            if (control.ID == id)
            {
                return control;
            }
            var childResult = FindControl(control, id);
            if (childResult != null)
            {
                return childResult;
            }
        }
        return null;
    }
于 2010-08-25T13:11:04.640 に答える
2

コードを次のように変更します

var div = new HtmlGenericControl("div");
Page.Controls.Add(div);
div.Controls.Add(new Literal() { ID = "litSomeLit" });
var lit = (Literal)div.FindControl("litSomeLit");

私の知る限り、FindControl は、コントロールがページのビジュアル ツリーにある場合にのみ機能します。

于 2010-08-24T19:36:56.213 に答える
0

コントロールが Controls コレクションにあることを確認したとき、コレクションを直接調べましたか? FindControl() は、このコンテキストでは機能しない場合があります。

テストをデバッグするとき、var はlitnull ですか? その場合は、FindControl() メソッドを使用する代わりに、アイテム インデックスでメンバーにアクセスする必要がある場合があります。

于 2010-08-24T18:40:56.247 に答える