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 undControls.Add(_updatePanel)
innerhalb derCreateChildControls
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
undCallBacksAsPostBacks
).Die Anweisung
Controls.Add(_updatePanel)
kann nicht innerhalb der RenderControl-Methode platziert werden, da sie für AJAX zu spät ist (aktuell istPreRender()
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);
}