【问题标题】:UpdatePanel with multiple DropDownList具有多个 DropDownList 的 UpdatePanel
【发布时间】:2016-04-16 10:35:25
【问题描述】:

编辑:这是DropDownList.Items.Clear(); 在我从 db 中列出一些东西的方法中,导致了问题。但是,我不明白为什么这会导致问题。如果我能给出解释,我将不胜感激,因为我真的需要使用 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 个工作同时进行?

谢谢

【问题讨论】:

  • 我无法重现该问题。当我以任何顺序从其中任何一个中进行选择时,我都会看到正确的列表编号。我在Page_Load 中填写列表(我不知道您的列表是如何填写的)。这是更复杂表格的一小部分吗?如果是这样,您可以在一个小型测试项目中测试该部分。顺便问一下,如果您在两次操作之间等待 5 秒,是否会出现问题?
  • @ConnorsFan 嗯,很奇怪。当我在 Page_Load 中简单地列出一些东西时,它也对我有用。在我的代码中,我通过一种方法将 db 中的一些值添加到下拉列表,在 Page_Load 中使用了 this.PreRender += MethodName。在这里添加的代码太多了,但是我的代码可能会出现什么错误?我只是连接到 db(使用 OleDb),将内容添加到每个 DropDownList 中,然后关闭该“MethodName”中的连接。顺便说一句,我等了超过 5 秒,还是同样的问题。
  • 编辑:好的,我发现了问题,在“MethodName”的开头,我为每个 DropDownList 得到了 Items.Clear,为什么会导致这个问题?

标签: c# asp.net updatepanel


【解决方案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>

【讨论】:

  • 只是一件事,我忘了提到我的 DropDownList 内容更改取决于对 db 的搜索。当我尝试更改 dpl 中的内容时出现错误“'dpl1' 的 SelectedValue 无效,因为它不存在于项目列表中。参数名称:值”。如果内容没有改变,该解决方案工作正常,但我不知道如何处理它。我找不到任何合适的解决方案。
  • 这个话题有一些曲折,使它变得有趣。我更新了我的答案。
猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多