具有多个下拉列表的更新面板

本文关键字:更新 下拉列表 | 更新日期: 2024-09-21 14:46:48

编辑:在我列出数据库中的一些东西的方法中DropDownList.Items.Clear();,这导致了问题。 但是,我不明白为什么这会导致问题。如果我能给出一个解释,我将不胜感激,因为我真的需要使用 Items.Clear((;不知何故

我得到了 3 DropDownList,我根据我在这 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 个作品?

谢谢

具有多个下拉列表的更新面板

清除和填充每个回发的下拉列表会弄乱列表中的选择。调用 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;
    }
}

顺便说一下,为了查看列表项中的更改,我需要将三个下拉列表放入具有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>