2

Main.Master、内部マスター ページ Inner.Master、および abc.aspx があります。Inner.Master には、Inner.Master ページの読み込み時に入力するドロップダウンリスト ddlChildren があります。

ページ abc.aspx をロードするときに、マスター ページ Inner.Master から ddlChildren にアクセスしたいと思います。

int x = Int32.Parse(((DropDownList)this.Parent.FindControl("ddlChildren")).SelectedValue);

abc.aspx のページ読み込みでこれを行っています。問題は、このコントロールが見つからないことです。これは、コントロールがまだ Inner.Master にロードされていないために発生すると思います。

this.Parent.Controls.Count

デバッグ時には、Inner.Master のコントロールが 1 つしかありません。これは Main.Master です。

次に、ddlChildren onPreRender を呼び出そうとしましたが、同じことが起こります。

http://msdn.microsoft.com/en-us/library/ms178472.aspxによると、コントロールはレンダリング前に読み込まれますが、内部マスターのレンダリング前は AFTER abc.aspx と呼ばれます。別のページ段階でこれを行うことはできますか?

それとも私は完全に軌道から外れていますか?

4

1 に答える 1

1

マスター ページを含む、ライフサイクルの視覚的な内訳。

OK、ここではさらに多くのことが起こっていると思います。

まず第一に、FindControl探しているものが問題のオブジェクトの直接の子でない限り、再帰的ではありません。

次のような関数が必要になります (テストされていませんが、以前に同様の関数を書いたことがあります)。

private WebControl FindControlRecursive(WebControl parentControl, string controlId)
{
    if( !parentControl.Controls.Any())
        return null;

    var foundControl = parentControl.FindControl(controlId);

    if(foundControl == null)
    {
        foreach(child in parentControl.Controls)
        {
            var foundChild = FindControlRecursive(child, controlId);

            if(foundChild != null)
                return foundChild;    
        }
    }

    return foundControl;
}

Parent次に、自分のページがマスター ページであると想定しています。これは真実ではないかもしれません。ここでPage.MasterPage詳細を試してみてください。

結論として、これを試してください:

var dropDown = (DropDownList)FindControlRecursive(Page.MasterPage, "ddlChildren");

もう一つ。通常、現在の Page スコープより上のレベルに存在するコントロールにアクセスしている場合は、設計を再考することを検討することをお勧めします。

于 2012-04-13T18:19:33.680 に答える