Я пытаюсь написать генератор цитат. Для каждого продукта есть набор опций. Я хочу динамически добавить раскрывающийся список для каждого параметра, а затем настроить все события SelectedIndexChanged для обновления стоимости котировки.
У меня нет проблем с добавлением элементов управления DropDownList в мою панель UpdatePanel, но я не могу связать события.
После загрузки страницы раскрывающиеся списки со своими данными есть, но их изменение не вызывает ни обработчик события SelectedIndexChanged, ни обновление QuoteUpdatePanel. У меня есть что-то вроде этого:
Изменить: Поскольку программно добавлено Элементы управления AsyncPostBackTrigger не поддерживаются, я изменил свой код на это, но все равно не получаю событие:
Редактировать 2: Попытался добавить PlaceHolder для добавления раскрывающихся списков (вместо этого непосредственно в ContentTemplateContainer, по-прежнему никаких событий не происходит.
QuotePanel.ASCX
<asp:ScriptManager ID="ScriptManager" runat="server" />
<asp:UpdatePanel ID="QuoteUpdatePanel" runat="server" ChildrenAsTriggers="true">
<ContentTemplate>
Cost: <asp:Label ID="QuoteCostLabel" runat="server" />
<fieldset id="standard-options">
<legend>Standard Options</legend>
<asp:UpdatePanel ID="StandardOptionsUpdatePanel" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
<ContentTemplate>
<asp:PlaceHolder ID="StandardOptionsPlaceHolder" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
</fieldset>
</ContentTemplate>
</asp:UpdatePanel>
Код для добавления раскрывающихся списков и события, для которого они должны быть подключены:
protected void PopluateUpdatePanel(IEnumerable<IQuoteProperty> standardOptions)
{
foreach (IQuoteProperty standardOp in standardOptions)
{
QuotePropertyDropDownList<IQuoteProperty> dropDownList = new QuotePropertyDropDownList<IQuoteProperty>(standardOp);
dropDownList.SelectedIndexChanged += QuotePropertyDropDown_SelectedIndexChanged;
dropDownList.ID = standardOp.GetType().Name + "DropDownList";
dropDownList.CssClass = "quote-property-dropdownlist";
Label propertyLabel = new Label() {Text = standardOp.Title, CssClass = "quote-property-label"};
StandardOptionsPlaceHolder.Controls.Add(propertyLabel);
StandardOptionsPlaceHolder.Controls.Add(dropDownList);
_standardOptionsDropDownLists.Add(dropDownList);
ScriptManager.RegisterAsyncPostBackControl(dropDownList);
}
}
void QuotePropertyDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
QuoteCostLabel.Text = QuoteCost.ToString();
StandardOptionsUpdatePanel.Update();
}