0

2 つのスクリプト コントロールがあります (コードは非常に単純化されています)。

class Form : IScriptControl
{
      Panel pnl;
      Button trigger;
      public Form()
      {
           pnl = new Panel();
           trigger = new Button();

           IPresenter p = new Popup();
           p.SetContent(this.pnl);           
           this.Controls.Add(trigger);
      }
}

class Popup : IScriptControl, IPresenter
{
      public void SetContent(Control content)
      {
           this.Controls.Add(content);
      }
}

HTML出力には、次のように表示されます(これも非常に単純化されています):

<div id="ctrlForm">
    <div id="ctrlPopup">
        <div id="ctrlFormPnl"></div>
    </div>
    <div id="ctrlFormTrigger"></div>
</div>

そしてスクリプト:

Sys.Application.add_init(function() {
    $create(Form, {"_presenter":"FormPresenter"}, null, null, $get("ctrlForm"));
});
Sys.Application.add_init(function() {
    $create(Popup, {"_isOpen":false}, null, null, $get("ctrlPopup"));
});

質問: ポップアップを作成するスクリプトがフォームのスクリプトの前にページに表示されるようにするにはどうすればよいでしょうか。

やりたいことを明確に説明していただければ幸いです。ありがとう。

4

1 に答える 1

1

目標をアーカイブするには、コントロールの前に子コントロールを ScriptManager に登録できるようにする必要があり ます。

base.Render(...) を次のように呼び出した後、オーバーライドされた Render メソッド内で ScriptManager を使用してコントロールを登録すると、これを実行できます。

    protected override void Render(HtmlTextWriter writer)
    {
        // Let child controls to register with ScriptManager
        base.Render(writer);

        // Now, when all the nested controls have been registered with ScriptManager
        // We register our control.
        // This way $create statement for this control will be rendered
        // AFTER the child controls' $create 
        if (this.DesignMode == false)
        {
            ScriptManager sm = ScriptManager.GetCurrent(this.Page);
            if (sm != null)
                sm.RegisterScriptDescriptors(this);
        }

   }
于 2012-10-31T23:29:23.100 に答える