如何以编程方式将触发器添加到ASP.NET UpdatePanel?
我正在尝试编写一个引用生成器.对于每种产品,都有一组选项.我想为每个选项动态添加一个下拉列表,然后将他们的SelectedIndexChanged事件全部连接起来以更新报价成本.
我将DropDownList控件添加到我的UpdatePanel没有任何问题,但我似乎无法连接事件. 页面加载后,下拉列表及其数据,但更改它们不会调用SelectedIndexChanged事件处理程序,QuoteUpdatePanel也不会更新. 编辑:自programmatically adding AsyncPostBackTrigger controls is not supported以来,我已将我的代码更改为此,但我仍然没有得到该事件: 编辑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(); } 解决方法
AFAIK,以编程方式向UpdatePanel控件添加异步触发器正在工作.
解决方法是在Page_Init事件中添加它们,并将trigger的ControlID属性设置为控件唯一ID值: AsyncPostBackTrigger trigger = new AsyncPostBackTrigger(); // unique id instead of client id trigger.ControlID = yourDropDownControl.UniqueID; trigger.EventName = "SelectedIndexChanged"; QuoteUpdatePanel.Triggers.Add(trigger); 似乎使这项工作.我在上面创建了类似的页面/控件结构.因此有用户控制QuotePropertyControl和默认页面,它持有此控件. 我添加了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); } Default.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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- .net – 有没有办法在Crystal Reports中渲染LaTeX方程?
- asp.net-mvc-3 – jQuery.validator.unobtrusive.adapters.
- asp.net-mvc – asp.net mvc用户身份验证/权限
- asp.net – 连接模式和断开模型在EF
- ASP.NET MVC:访问日志
- 使用“正确的”.NET Framework版本
- asp.net – ViewState [“object”]和Page.Items [“object
- 在Entity Framework中使用存储过程(四):如何为Delete存储
- asp.net-mvc-3 – 带有重音IE8的ASP MVC3 FileResult – 被
- asp.net-mvc-3 – NHibernate.ObjectNotFoundException:不
- 玩玩asp.net 2.0的caching系列二 - RemoveOutput
- asp.net中的泛型处理程序是什么?
- 获取Uploadify以使用asp.net-mvc
- asp.net-mvc – 图像URL中的&符号MVC导致一个
- ASP.NET MVC不适用于ViewState和Postback?
- asp.net-mvc – ASP.Net MVC TempData – 如何保
- ASP.NET MVC 3可以在ASP.NET 3.5网站中运行吗?
- iis-7 – 经典ASP,在Windows Server 2008上发送电
- asp.net-mvc – 保持asp.net mvc控制器的大小
- asp.net-mvc-3 – ASP.NET MVC3 URL参数解析为nu