就像你在网站上寻找支持一样,你从第一个列表框(比如硬盘)中选择产品,它会触发并填充第二个列表框,其中包含更多选项(例如,“固态”,“ SATA“),等等......
我遇到的问题是,当您从第二个列表框中选择应该填充第三个列表框的内容时,回发也会触发第一个列表框,然后将第二个列表框重新填充回其默认值。
例如
[下拉1](包含A B C D E)
[DropDown 2](下拉列表1中的A有选项X Y Z)
[下拉3] ......
如果选择A,则下拉2填充XYZ。你选择Z,它应该更新dropdown3,但是回发也会再次触发下拉列表1,它会取代Dropdown 2的内容并将值重置为X.
我正在寻找一个优雅的解决方案。如果下拉列表1已更改,我有一个说只重新填充下拉列表2,但它意味着在页面回发之前跟踪下拉列表1。
每个下拉列表都在更新面板中,并设置为autopostback = true,每个更新面板的触发器中都有前一个列表框。
答案 0 :(得分:2)
首先检查第二个TextBox是否不是第一个UpdatePanel的触发器,如果是,则从第一个更新面板的Triggers Collection中删除它。
以下是关键概念:
如果你有两个单独的标签,你应该在第二个更新面板中放置一个触发器标签,并插入一个AsyncPostBackTrigger和第一个下拉列表的controlID,这里是一个简单的示例:
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:Label runat="server" ID="TxtBox1" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:Label runat="server" ID="TxtBox2" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="TxtBox1" />
</Triggers>
</asp:UpdatePanel>
答案 1 :(得分:0)
我只是将所有下拉列表放在同一个更新面板中。它可能效率不高,但它可能足够好,当然也需要更少的代码行。
答案 2 :(得分:0)
为什么不尝试使用AjaxControl Toolkit CascadingDropDown。它似乎符合您的需求。
此外,这将提高性能,因为回发将不会发送所有页面信息(与更新面板一样)。
答案 3 :(得分:0)
我想通了 - 我可以使用ScriptManager1.AsyncPostBackSourceElementID来检查导致触发器的原因,并使其仅为回发和第一个下拉框刷新。
答案 4 :(得分:0)
也许我在想太简单了,但为什么你不能只处理所有这些事件......作为事件?仅在初始Page_Load
上填充DDL1。仅在DDL1.SelectedIndexChanged
上填充DDL2。仅在DDL2.SelectedIndexChanged
...