具有多个 DropDownList 的 UpdatePanel
UpdatePanel with multiple DropDownList
编辑:DropDownList.Items.Clear();
在我列出一些来自数据库的东西的方法中,导致了问题。但是,我不明白为什么这会导致问题。如果我能给出解释,我将不胜感激,因为我确实需要使用 Items.Clear();不知何故
我得到了 3 个 DropDownList
,我根据 select 在这 3 个 DropDownList
之一中的值更新了一个特定的标签。每个 DropDownList
工作正常,直到我选择下一个,之前的其他人不会通过 UpdatePanel 触发。
例如第一个有效,但在我使用第二个后停止工作(标签不会更新)。
第二个工作但是一旦使用第三个 DropDownList
,第二个也不会工作,只有第三个 DropDownList
工作正常。
如果我立即使用第三个,第一个和第二个 DropDownList
将无法通过 UpdatePanel 工作。
换句话说,一旦最新的DropDownList
被使用,它之前的每个DropDownList
都不会通过UpdatePanel触发。
aspx:
<asp:DropDownList ID="dpl1" runat="server" OnSelectedIndexChanged="dpl1_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:DropDownList ID="dpl2" runat="server" OnSelectedIndexChanged="dpl2_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:DropDownList ID="dpl3" runat="server" OnSelectedIndexChanged="dpl3_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:UpdatePanel runat="server" ID="UpdatePanel" UpdateMode="Conditional" >
<ContentTemplate>
<asp:Label ID="lblDPB" runat="server"/>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="dpl1" EventName="SelectedIndexChanged" />
<asp:AsyncPostBackTrigger ControlID="dpl2" EventName="SelectedIndexChanged" />
<asp:AsyncPostBackTrigger ControlID="dpl3" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
后面的代码:
protected void dpl1_OnSelectedIndexChanged(object sender, EventArgs e) {
lblDPB.Text = "#1: ";
}
protected void dpl2_OnSelectedIndexChanged(object sender, EventArgs e) {
lblDPB.Text = "#2: ";
}
protected void dpl3_OnSelectedIndexChanged(object sender, EventArgs e)
{
lblDPB.Text = "#3: ";
}
如何同时制作所有这 3 个作品?
谢谢
在每次回发时清除和填充 DropDownList 会弄乱列表中的选择。调用 Items.Clear()
清空 SelectedValue
并将 SelectedIndex
设置为 -1。填满列表后,第一项被选中。所有这些处理都会导致 SelectedIndexChanged
事件在意外时刻触发。
避免此问题的一种方法是在调用 Items.Clear()
之前保存所选值,并在重新填充列表后将它们重新设置:
protected void Page_Load(object sender, EventArgs e)
{
...
string val1 = dpl1.SelectedValue;
string val2 = dpl2.SelectedValue;
string val3 = dpl3.SelectedValue;
dpl1.Items.Clear();
dpl2.Items.Clear();
dpl3.Items.Clear();
// Fill the lists here
SafeSelectValue(dpl1, val1);
SafeSelectValue(dpl2, val2);
SafeSelectValue(dpl3, val3);
}
private void SafeSelectValue(ListControl lst, string value)
{
// Makes sure that the value exists before selecting it
if (lst.Items.FindByValue(value) != null)
{
lst.SelectedValue = value;
}
}
顺便说一下,为了查看列表项的变化,我需要将三个 DropDownLists 放在一个 UpdatePanel 中 UpdateMode="Always"
:
<asp:UpdatePanel runat="server" UpdateMode="Always">
<ContentTemplate>
<asp:DropDownList ID="dpl1" runat="server" OnSelectedIndexChanged="dpl1_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:DropDownList ID="dpl2" runat="server" OnSelectedIndexChanged="dpl2_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:DropDownList ID="dpl3" runat="server" OnSelectedIndexChanged="dpl3_OnSelectedIndexChanged" AutoPostBack="True" />
</ContentTemplate>
</asp:UpdatePanel>
编辑:DropDownList.Items.Clear();
在我列出一些来自数据库的东西的方法中,导致了问题。但是,我不明白为什么这会导致问题。如果我能给出解释,我将不胜感激,因为我确实需要使用 Items.Clear();不知何故
我得到了 3 个 DropDownList
,我根据 select 在这 3 个 DropDownList
之一中的值更新了一个特定的标签。每个 DropDownList
工作正常,直到我选择下一个,之前的其他人不会通过 UpdatePanel 触发。
例如第一个有效,但在我使用第二个后停止工作(标签不会更新)。
第二个工作但是一旦使用第三个 DropDownList
,第二个也不会工作,只有第三个 DropDownList
工作正常。
如果我立即使用第三个,第一个和第二个 DropDownList
将无法通过 UpdatePanel 工作。
换句话说,一旦最新的DropDownList
被使用,它之前的每个DropDownList
都不会通过UpdatePanel触发。
aspx:
<asp:DropDownList ID="dpl1" runat="server" OnSelectedIndexChanged="dpl1_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:DropDownList ID="dpl2" runat="server" OnSelectedIndexChanged="dpl2_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:DropDownList ID="dpl3" runat="server" OnSelectedIndexChanged="dpl3_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:UpdatePanel runat="server" ID="UpdatePanel" UpdateMode="Conditional" >
<ContentTemplate>
<asp:Label ID="lblDPB" runat="server"/>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="dpl1" EventName="SelectedIndexChanged" />
<asp:AsyncPostBackTrigger ControlID="dpl2" EventName="SelectedIndexChanged" />
<asp:AsyncPostBackTrigger ControlID="dpl3" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
后面的代码:
protected void dpl1_OnSelectedIndexChanged(object sender, EventArgs e) {
lblDPB.Text = "#1: ";
}
protected void dpl2_OnSelectedIndexChanged(object sender, EventArgs e) {
lblDPB.Text = "#2: ";
}
protected void dpl3_OnSelectedIndexChanged(object sender, EventArgs e)
{
lblDPB.Text = "#3: ";
}
如何同时制作所有这 3 个作品?
谢谢
在每次回发时清除和填充 DropDownList 会弄乱列表中的选择。调用 Items.Clear()
清空 SelectedValue
并将 SelectedIndex
设置为 -1。填满列表后,第一项被选中。所有这些处理都会导致 SelectedIndexChanged
事件在意外时刻触发。
避免此问题的一种方法是在调用 Items.Clear()
之前保存所选值,并在重新填充列表后将它们重新设置:
protected void Page_Load(object sender, EventArgs e)
{
...
string val1 = dpl1.SelectedValue;
string val2 = dpl2.SelectedValue;
string val3 = dpl3.SelectedValue;
dpl1.Items.Clear();
dpl2.Items.Clear();
dpl3.Items.Clear();
// Fill the lists here
SafeSelectValue(dpl1, val1);
SafeSelectValue(dpl2, val2);
SafeSelectValue(dpl3, val3);
}
private void SafeSelectValue(ListControl lst, string value)
{
// Makes sure that the value exists before selecting it
if (lst.Items.FindByValue(value) != null)
{
lst.SelectedValue = value;
}
}
顺便说一下,为了查看列表项的变化,我需要将三个 DropDownLists 放在一个 UpdatePanel 中 UpdateMode="Always"
:
<asp:UpdatePanel runat="server" UpdateMode="Always">
<ContentTemplate>
<asp:DropDownList ID="dpl1" runat="server" OnSelectedIndexChanged="dpl1_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:DropDownList ID="dpl2" runat="server" OnSelectedIndexChanged="dpl2_OnSelectedIndexChanged" AutoPostBack="True" />
<asp:DropDownList ID="dpl3" runat="server" OnSelectedIndexChanged="dpl3_OnSelectedIndexChanged" AutoPostBack="True" />
</ContentTemplate>
</asp:UpdatePanel>