0

次の問題を解決しようとしています。

別のコントロール内に動的にロードする必要があるユーザー コントロールがあります。この動的にロードされたコントロールはイベントを発生させます。私の知る限り、動的にロードされたコントロールによって発生したイベントは、onload イベント中にコントロールが作成およびロードされた場合にのみ正しく処理されます。コントロールを動的にロードするときに考慮しなければならないもう 1 つの制約があり、それは親コントロールのプロパティです。このプロパティは、コントロールをロードする必要があるかどうかを決定します。

疑似コード:

ControlA
  Property ShowControl
  ControlA has a CheckBox(chkShowControlIfSelected)
  OnLoadEvent()
    If chkShowControlIfSelected.checked checked and ShowControlProperty is set
    {
       reate ControlB Dynamically
       ControlB.Event += EventHandler()
       Add ControlB to ControlCollection
    }

私が直面している問題は、prerender イベントに controlB をロードするコードを含めると、プロパティ ShowControl は正しく設定されますが、EventHandler() が呼び出されないことです。pageLoad イベントで controlB を動的にロードするコードを配置すると、プロパティ ShowControl はまだ設定されていませんが、その場合は eventHandler コードが正しく呼び出されます。

何かが足りないのでしょうか、それとも正しくないイベント ハンドラーでコードを処理しているのでしょうか?

4

1 に答える 1

1

以下は実際の例です。

コントロールA:

public partial class ControlA : System.Web.UI.UserControl
{
    public bool ShowControl
    {
        get
        {
            if (this.ViewState["ShowControl"] == null)
                return false;
            else
                return (bool)this.ViewState["ShowControl"];
        }
        set
        {
            this.ViewState["ShowControl"] = value;
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (this.ShowControl)
        {
            var controlB = (ControlB)this.LoadControl("ControlB.ascx");
            controlB.FileUploadingComplete += controlB_FileUploadingComplete;
            this.pnl1.Controls.Add(controlB);
        }
    }

    void controlB_FileUploadingComplete(object sender, EventArgs e)
    {
        //throw new NotImplementedException();
        Trace.Write("file upload completed");
    }
}

コントロール B:

public partial class ControlB : System.Web.UI.UserControl
{
    public event EventHandler FileUploadingComplete;
    protected void OnFileUploadingComplete()
    {
        if (this.FileUploadingComplete != null)
            this.FileUploadingComplete(this, EventArgs.Empty);
    }

    protected void btn1_Click(object sender, EventArgs e)
    {
        this.OnFileUploadingComplete();
    }
}

ページ (ControlA存在する):

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.ControlA1.ShowControl = true;
    }
}
于 2014-05-13T19:16:22.873 に答える