2012-10-22 18 views
0

我有一堆不同的面板是自定義服務器控件,它繼承了CompositeControl。面板通過使用CreateChildControls()呈現。我有一個頁面,顯示它們是基於用戶從comboBox中選擇的。當您更改選擇時,它會爲回調面板(DevExpress控件)執行回調,這就像更新面板一樣。根據選擇它將面板添加到回調面板。但是,似乎如果您從回調中執行此操作,則服務器控件生命週期不會開始,因此它從不調用CreateChildControls()或OnPreRender()。關於如何使這項工作的任何想法? EnsureChildControls()似乎沒有幫助。在回調中呈現服務器控件

這裏是面板

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); 
    } 
+1

向我們展示一些代碼,如何創建控件並將其添加到頁面控件? – Allov

+0

添加了一些示例代碼。 –

回答

0

在回調的一些示例代碼請求的PreRender和渲染方法不被執行(這是與回發請求的主要區別)。但是應該執行CreateChildControls。請提供更多信息或代碼示例。

相關問題