具有多个DropDownList的UpdatePanel

时间:2016-04-16 10:35:26

标签: c# asp.net updatepanel

编辑:在我从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: ";          
    }

如何同时制作所有这三部作品?

由于

1 个答案:

答案 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>