编辑:在我从db中列出一些东西的方法中DropDownList.Items.Clear();
导致了这个问题。但是,我不明白为什么会导致这个问题。如果我能给出解释,我真的很感激,因为我真的需要使用Items.Clear();不知何故
我有3个DropDownList
,根据我在其中一个DropDownList
中选择的值,我会更新特定标签。每个DropDownList
都可以正常工作,直到我选择下一个,并且之前的其他人不会通过UpdatePanel触发。
E.g。第一个工作,但一旦我使用第二个工作,停止工作(标签不会更新)。
第二个工作但是一旦使用了第三个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: ";
}
如何同时制作所有这三部作品?
由于
答案 0 :(得分:1)
清除并填充每个回发上的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放在一个带有UpdateMode="Always"
的UpdatePanel中:
<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>