dropdownlist中的First Item根本不会触发SelectedIndexChanged

时间:2012-01-02 09:24:20

标签: c# asp.net

我有以下简单的代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testForm.aspx.cs" Inherits="Orbs.testForm" %>
<html>
<body>
    <form id="form1" runat="server">
        <asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged" ViewStateMode="Enabled">
            <asp:ListItem Value="1" Text="Item 1" />
            <asp:ListItem Value="2" Text="Item 2" />
            <asp:ListItem Value="3" Text="Item 3" />
            <asp:ListItem Value="4" Text="Item 4" />
            <asp:ListItem Value="5" Text="Item 5" />
        </asp:DropDownList>
        <asp:Label runat="server" ID="label1"></asp:Label>
    </form>
</body>
</html>

这是我背后的代码

using System;

namespace Orbs {
    public partial class testForm: System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {
            label1.Text = "???!!";
        }

        protected void dropdown1_SelectedIndexChanged(object sender, EventArgs e) {
            label1.Text = "Fired on " + dropdown1.SelectedValue;
        }

    }
}

首次进入该页面时,label1会显示'???!!'。现在我从下拉列表中选择一个项目,label1显示正确的值但是当我在下拉列表中选择第一个项目时,它会再次显示???!!而不是Fired on 1

我做错了什么?

编辑:我注意到如果我将Selected="True"添加到下拉列表中的任何项目,该项目就会成为受害者,并且不会触发该事件!

7 个答案:

答案 0 :(得分:14)

对于仍有问题的人;我用一种不同的,更简单的方式解决了它: 只需将一个虚拟ListItem添加到DropDownList的开头,并将该项的Enabled属性设置为false。 即。

<asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged" ViewStateMode="Enabled">
        <asp:ListItem Value="" Text="" Enabled="false" />
        <asp:ListItem Value="1" Text="Item 1" />
        <asp:ListItem Value="2" Text="Item 2" />
        <asp:ListItem Value="3" Text="Item 3" />
        <asp:ListItem Value="4" Text="Item 4" />
        <asp:ListItem Value="5" Text="Item 5" />
    </asp:DropDownList>

答案 1 :(得分:3)

我自己解决了这个问题,

我在某个地方看到关闭ViewStateMode会导致DropDownList无法正常工作。在我的Web应用程序中,我不得不关闭ViewStateMode来完成一些全局任务并逐个启用它。

以某种方式启用ViewStateMode上的DropDownList无法正常工作,我甚至尝试为页面和母版页打开ViewStateMode,但仍然DropDownList无效。只有当我在ViewStateMode中启用web.config时,它才有效。

由于ViewStateMode中的web.config无法启用,我找到了替代解决方案。我把它包括在这里,希望能有所帮助。

  • 在表单中添加HiddenField
  • Page_Load HiddenFieldRequest.Forms[DropDownList1.UniqueID]
  • SelectedIndexChanged比较值
  • 如果不同,请手动拨打HiddenField
  • Request.Forms[DropDownList1.UniqueID]的值设置为{{1}}的值。

答案 2 :(得分:1)

有同样的问题 - 选择第一个选项时,SelectedIndexChanged不会触发, 我不干净的解决方案是(不确定它是如此聪明但它对我有用),

在Page_Load,我添加了以下脚本:

if (!IsPostBack)
        {

            //bind data first time
        }
        else
        {
            int ddlSortByValue = int.Parse(ddlSortBy.SelectedValue);
            if (ddlSortByValue == 0)
            {
                ddlSortBy_SelectedIndexChanged(this, EventArgs.Empty);
            }

        }

这样我强制启动SelectedIndexChanged事件

答案 3 :(得分:1)

这个问题比其他帖子更能涵盖所有可能性,所以我添加了这个明确的答案。就我而言,@ Edyn的评论有效,尽管最初的问题已经存在:

在下拉控件本身设置x:name 我还在页面顶部的页面声明中设置它,以防万一。

这是.Net 4.0,所以也许有些东西被改变了(但肯定没有很好地修复)。

答案 4 :(得分:1)

我遇到了同样的问题,但我通过手动调用onindexchanged函数解决了这个问题,如下所示:

ddl_SelectedIndexChanged(null, null);

我知道这可能不是一个完美的方式,但它对我有用。

答案 5 :(得分:0)

这种情况正在发生,因为您将标签设置为“??? !!”每一页活动。

您需要修改页面加载以检测未发生回发。

    protected void Page_Load(object sender, EventArgs e) {
        if(!IsPostBack)
        {
            label1.Text = "???!!";
        }
    }

答案 6 :(得分:0)

在我的情况下,发生这种情况是因为我使用本地dropdownlist变量引用了该下拉列表,并在函数末尾处理了该变量。我在设置数据源后将第一项添加到下拉列表中。花了我2个小时找到这个,并在我取消处理电话后工作得很好。