0

CompositeControl を継承するカスタム サーバー コントロールであるさまざまなパネルが多数あります。パネルは、CreateChildControls() を使用してレンダリングされます。コンボボックスからのユーザーの選択に基づいてそれらを表示しているページがあります。選択を変更すると、更新パネルのようなコールバック パネル (DevExpress コントロール) のコールバックが実行されます。選択に基づいて、パネルをコールバック パネルに追加します。しかし、コールバックからこれを行うと、サーバー コントロールのライフ サイクルが開始されないように思われるため、CreateChildControls() または OnPreRender() を呼び出すことはありません。これを機能させる方法についてのアイデアはありますか?EnsureChildControls() は役に立たないようです。

パネルの 1 つのコード例を次に示します。

    protected override void CreateChildControls()
    {
        base.CreateChildControls();

        String strParentID = this.ClientInstanceName.Length > 0 ? this.ClientInstanceName : this.ClientID;
        String strID = "";//Used as ID and ClientInstanceName.
        String strKey = "";//Used in the ID and as the ControlInfo key.

        if (!DesignMode)
        {
            //*******************************************************************

            ASPxLabel lblUnit = new ASPxLabel();
            lblUnit.Text = "Select Unit(s)";
            callbackEdit.Controls.Add(lblUnit);

            //*******************************************************************

            strKey = "btnUnitSelector";
            strID = strParentID + "_" + strKey;
            btnUnitSelector = new ASPxButton()
            {
                ID = strID,
                ClientInstanceName = strID,
                CssFilePath = this.CssFilePath,
                CssPostfix = this.CssPostfix,
                SpriteCssFilePath = this.SpriteCssFilePath,
            };

            btnUnitSelector.Width = Unit.Pixel(180);
            btnUnitSelector.AutoPostBack = false;

            this.listControlInfo.Add(new ControlInfo(strKey, btnUnitSelector.ClientInstanceName, btnUnitSelector.ClientID));
            callbackEdit.Controls.Add(btnUnitSelector);

            //*******************************************************************

            strKey = "unitPopup";
            strID = strParentID + "_" + strKey;

            unitPopup = new UnitPopup.UnitPopup();
            unitPopup.ID = strID;
            unitPopup.ClientInstanceName = strID;
            unitPopup.btnOk_AutoPostBack = false;
            unitPopup.ShowOnlyUnits = false;
            unitPopup.DataSource = GlobalProperties.Company_UnitsAndAreas;
            unitPopup.DataBind();
            btnUnitSelector.ClientSideEvents.Click = "function (s, e) { " + unitPopup.ClientInstanceName + ".Show(); }";
            unitPopup.ClientSideEvents.MemberSet = "function (s, e) { " + btnUnitSelector.ClientInstanceName + ".SetText(" + unitPopup.ClientInstanceName + ".selectedMemberName); }";

            Controls.Add(unitPopup);
            //*******************************************************************
        }
    }

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        ClientScriptManager cs = this.Page.ClientScript;

        //Register an embedded JavaScript file. The JavaScript file needs to have a build action of "Embedded Resource".
        String resourceName = "QSR_ServerControls.Controls.DashboardControls.SalesChart.SalesChart.js";
        cs.RegisterClientScriptResource(typeof(SalesChart), resourceName);
    }

パネルを追加するサンプルコードを次に示します

    private void PopulatePanel(string panel)
    {
        tblDescCell.Controls.Add(new LiteralControl(GetPanels().Select("[PanelName] = '" + panel + "'")[0]["PanelDescription"].ToString()));
        if (panel == "SalesChart")
            tblTopLeftCell.Controls.Add(new SalesChart.SalesChart());
    }

    void callbackMain_Callback(object sender, DevExpress.Web.ASPxClasses.CallbackEventArgsBase e)
    {
        PopulatePanel(e.Parameter);
    }
4

1 に答える 1

0

コールバック リクエストの間、PreRender メソッドと Render メソッドは実行されません (これが PostBack リクエストとの主な違いです)。ただし、CreateChildControls は実行する必要があります。詳細情報またはコード例を提供してください。

于 2012-10-22T17:32:42.057 に答える