gpt4 book ai didi

asp.net - 如何以编程方式向 ASP.NET UpdatePanel 添加触发器?

转载 作者:行者123 更新时间:2023-12-01 01:34:40 24 4
gpt4 key购买 nike

我正在尝试编写一个报价生成器。对于每个产品,都有一组选项。我想为每个选项动态添加一个下拉列表,然后将它们的 SelectedIndexChanged 事件全部连接起来以更新报价成本。

我将 DropDownList 控件添加到我的 UpdatePanel 没有任何问题,但我似乎无法连接事件。

页面加载后,下拉菜单和它们的数据就在那里,但更改它们不会调用 SelectedIndexChanged 事件处理程序,也不会更新 QuoteUpdatePanel。
我有这样的事情:

编辑:programmatically adding AsyncPostBackTrigger controls is not supported ,我已将代码更改为此,但我仍然没有收到该事件:

编辑 2:尝试添加 PlaceHolder 以将下拉列表添加到(而不是直接添加到 ContentTemplateContainer,仍然没有触发事件。

报价面板

<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事件和设置触发器的 ControlID控件唯一 id 值的属性:

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

似乎做了这项工作。我在上面创建了类似的页面/控件结构。所以有用户控制 QuotePropertyControlDefault包含此控件的页面。

我加了 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>

关于asp.net - 如何以编程方式向 ASP.NET UpdatePanel 添加触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2715623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com