2010-04-26 4 views
4

Я пытаюсь написать генератор цитат. Для каждого продукта есть набор опций. Я хочу динамически добавлять выпадающий список для каждого параметра, а затем все события SelectedIndexChanged подключаются для обновления стоимости котировки.Как я могу программно добавить триггеры в ASP.NET UpdatePanel?

У меня нет никаких проблем с добавлением элементов управления DropDownList в мою UpdatePanel, но я не могу подключить события.

После загрузки страницы выпадающие списки с их данными, но их изменение не вызывает обработчик события SelectedIndexChanged и обновление QuoteUpdatePanel. у меня есть что-то вроде этого:

Edit: С programmatically adding AsyncPostBackTrigger controls is not supported, Я изменить свой код, но я до сих пор не получить событие:

Edit 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(); 
} 
+0

Dang! Нет ввода? – scottm

ответ

4

AFAIK, добавив асинхра триггеров управления программным работают UpdatePanel.

Чтобы обойти эту проблему, чтобы добавить их в Page_Init события и набор триггера ControlID собственности уникальное значение идентификатора управления:

AsyncPostBackTrigger trigger = new AsyncPostBackTrigger(); 
// unique id instead of client id 
trigger.ControlID = yourDropDownControl.UniqueID; 
trigger.EventName = "SelectedIndexChanged"; 
QuoteUpdatePanel.Triggers.Add(trigger); 

кажись сделал эту работу. Я создал аналогичную структуру страницы/управления выше. Таким образом, есть элемент управления пользователя QuotePropertyControl и Default, который содержит этот элемент управления.

Я добавил dropDownList.AutoPostBack = true недвижимости и смог поймать асинхронный обратный вызов из выпадающего списка. Итак, угадав, что проблема была в этом свойстве.

Еще одна вещь: на самом деле не имеет значения, как зарегистрировать асинхронный триггер; оба варианта ScriptManager.RegisterAsyncPostBackControl и через AsyncPostBackTrigger работали как шарм (до события init на странице).

Вот как я это сделал:

QuotePropertyControl.ascx.cs

private string[] data = { "a", "b", "c", "d", "e" }; 

public void PopluateUpdatePanel(IEnumerable<string> standardOptions) 
{ 
    foreach (string standardOp in standardOptions) 
    { 
     DropDownList dropDownList = new DropDownList(); 
     dropDownList.SelectedIndexChanged += 
      QuotePropertyDropDown_SelectedIndexChanged; 
     dropDownList.ID = standardOp + "DropDownList"; 
     dropDownList.CssClass = "quote-property-dropdownlist"; 
     dropDownList.AutoPostBack = true; 
     dropDownList.DataSource = data; 
     dropDownList.DataBind(); 

     Label propertyLabel = new Label() { Text = standardOp }; 

     StandardOptionsPlaceHolder.Controls.Add(propertyLabel); 
     StandardOptionsPlaceHolder.Controls.Add(dropDownList); 

     ScriptManager.GetCurrent(Page) 
      .RegisterAsyncPostBackControl(dropDownList); 
    } 
} 

protected void QuotePropertyDropDown_SelectedIndexChanged(
    object sender, 
    EventArgs e 
    ) 
{ 
    StandardOptionsUpdatePanel.Update(); 
} 

QuotePropertyControl.ascx

<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> 

Default.aspx.cs

string[] names = { "ab", "bc", "ef" }; 

protected void Page_Init(object sender, EventArgs e) 
{ 
    ctlQuoteProperty.PopluateUpdatePanel(names); 
} 

По умолчанию.aspx

<%@ Register Src="~/QuotePropertyControl.ascx" 
      TagPrefix="uc" 
      TagName="QuoteProperty" %> 

<form id="form1" runat="server"> 
<div> 
    <asp:ScriptManager ID="ScriptManager" runat="server" /> 
    <uc:QuoteProperty runat="server" 
     ID="ctlQuoteProperty"> 
    </uc:QuoteProperty> 
</div> 
</form> 
+0

Это отдельный пользовательский элемент управления. В текущей реализации я добавил триггеры в событие QuotePanelControl_Init(). После вашего предложения я сделал метод PopulateUpdatePanel общедоступным и вызвал его из события Init Init. У меня до сих пор нет никаких событий. – scottm

+0

@scottm: Я попробую это на моей стороне и сообщит о прогрессе – Alex

+0

В этом была проблема! спасибо – scottm

Смежные вопросы