2010-11-24 8 views
2

Ich erstelle ein benutzerdefiniertes Serversteuerelement, das von CompositeControl abgeleitet wird.
Das Steuerelement enthält eine Reihe untergeordneter Steuerelemente (Labels, DropDownList, ListSearchExtender usw.). Alle von ihnen befinden sich in einem UpdatePanel.
Die Steuerung veröffentlicht auch Ereignisse. Dazu habe ich zwei Eigenschaften hinzugefügt: EnableCallBacks und CallBacksAsPostBacks. Diese beiden Eigenschaften sollten das Postback-Verhalten des Aktualisierungsfensters konfigurieren.Dynamisch hinzugefügt PostBackTrigger in benutzerdefiniertes Serversteuerelement, das nicht richtig gerendert wird

Irgendwelche Ideen, wie eine korrekte Implementierung aussehen sollte?

ich bin immer einige Probleme mit der Art, wie ich es umgesetzt:

  • der Postback immer in den Ausgang HTML gerendert nicht erhalten.

  • sowohl Triggers.Add(trigger) Having und Controls.Add(_updatePanel) innerhalb der CreateChildControls Methoden führt zu der Postback immer gemacht, auch wenn ich es entfernen später (zum Beispiel innerhalb Render() oder PreRender()). Wenn ich den Trigger hier aber nicht später hinzufüge, wird er nie gerendert. In diesem Stadium habe ich noch nicht die korrekten Werte aller meiner Eigenschaften (z. B. EnableCallBacks und CallBacksAsPostBacks).

  • Die Anweisung Controls.Add(_updatePanel) kann nicht innerhalb der RenderControl-Methode platziert werden, da sie für AJAX zu spät ist (aktuell ist PreRender() sonst bekomme ich eine Ausnahme).

  • Idealerweise würde ich alle Steuerelemente in CreateChildControls() instanziieren und dann ihre Werte später z. PreRender oder Render

  • Nachdem beide Aussagen in den PreRender Verfahren ergibt, dass der Auslöser corretly je nach meiner Einstellungen in der enthaltenden Seite gerendert wird, aber ich weiß nicht die Dropdownlist mit den Daten aus dem Viewstate bevölkert bekommen (auf Call/Postbacks).


protected override void CreateChildControls() 
{ 
    base.CreateChildControls(); 
    _updatePanel = new UpdatePanel(); 
    _updatePanel.ID = "FprDropDownList_UpPnl"; 
    _updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional; 

    _label = new FprLabel(); 
    _label.ID = "FprDropDownList_Lbl"; 
    _updatePanel.ContentTemplateContainer.Controls.Add(_label); 

    _dropDownList = new DropDownList(); 
    _dropDownList.ID = "FprDropDownList_Ddl"; 
    _dropDownList.CssClass = "fprDropDownList"; 
    _dropDownList.AutoPostBack = true; 
    _updatePanel.ContentTemplateContainer.Controls.Add(_dropDownList); 

    _label.AssociatedControlID = _dropDownList.ClientID; 

    _listSearchExtender = new ListSearchExtender(); 
    _listSearchExtender.ID = "FprDropDownList_Lse"; 
    _listSearchExtender.TargetControlID = _dropDownList.ClientID; 
    _listSearchExtender.PromptPosition = ListSearchPromtPosition; 
    _listSearchExtender.PromptCssClass = "fprListSearchExtender"; 
    _updatePanel.ContentTemplateContainer.Controls.Add(_listSearchExtender); 

    _ddlPostBackTrigger = new PostBackTrigger(); 
    _ddlPostBackTrigger.ControlID = _dropDownList.ClientID; 

    //_updatePanel.Triggers.Add(_ddlPostBackTrigger); 
    Controls.Add(_updatePanel); 
} 

protected override void OnPreRender(EventArgs pE) 
{ 
    if (EnableCallBacks) 
    { 
     _dropDownList.SelectedIndexChanged += DropDownList_SelectedIndexChanged; 
    } 
    if (EnableCallBacks && CallBacksAsPostBacks) 
    { 
    _updatePanel.Triggers.Add(_ddlPostBackTrigger); 
    } 
    //Controls.Add(_updatePanel); 
    base.OnPreRender(pE); 
} 

public override void RenderControl(HtmlTextWriter pWriter) 
{ 
    // Do some things... like set Enable-state of child controls 
    base.RenderControl(pWriter); 
} 

Antwort

0

Sie sollten Ihre dynamische Steuerelemente in PreInit hinzufügen für die Ereignisse richtig zu schießen.

Verwenden Sie dieses Ereignis für die folgenden:

  • Überprüfen Sie die IsPostBack Eigenschaft auf festzustellen, ob dies die erste
    Zeit ist die Seite bearbeitet wird. Die IsCallback und IsCrossPagePostBack
    Eigenschaften wurden auch auf diese Zeit eingestellt.
  • Dynamische Steuerelemente erstellen oder neu erstellen.
  • Legen Sie eine Masterseite dynamisch fest.
  • Setzen Sie die Eigenschaft Eigenschaft dynamisch.
  • Lesen oder setzen Sie Profileigenschaftswerte.