DropDownList错误 - 只有在HTML中填充DDL时才会触发OnSelectedIndexChanged

时间:2013-11-17 17:55:46

标签: asp.net postback html-select autopostback selectedindexchanged

THE CONCEPTION

步骤1. DropDownList填充了Page_Load上的项目。

步骤2.我选择一个项目并启动回发。在此回发页面首先刷新,然后OnSelectedIndexChanged触发并运行“ddl1_Select”函数。

问题

如果我使用Aspx(HTML)文件中的数据静态填充DropDownList,它可以正常工作。 但是,如果我在代码隐藏中填充它,OnSelectedIndexChanged事件永远不会触发,并且DDL1_Select过程不会启动。页面只是回发并跳过我的程序。为什么这个事件不会激活以及如何使它发挥作用?

ASPX:

<%@ Page Language="C#" MasterPageFile="~/Master.master" AutoEventWireup="true" 
CodeFile="mypage.aspx.cs" Inherits="mypage" Title="mypage" EnableViewState="False" %>

...

<asp:DropDownList ID="ddl1" runat="server" OnSelectedIndexChanged="ddl1_Select" AutoPostBack="True"/>

ASPX.CS:

protected void Page_Load(object sender, EventArgs e)
{
    ddl1.Items.Add("1");
    ddl1.Items[0].Value = "1";
    ddl1.Items.Add("2");
    ddl1.Items[1].Value = "2";
    ddl1.Items.Add("3");
    ddl1.Items[2].Value = "3";

    if (Session["NewSelection"] != null) // see note 1
    {
        string itemValue = Session["NewSelection"].ToString();
        ddl1.SelectedIndex = ddl1.Items.IndexOf(ddl1.Items.FindByValue(itemValue));
        Session["NewSelection"] = null; // see note 1
    }
}

protected void DDL1_Select(object o, EventArgs e)
{
    Session["NewSelection"] = ddl1.SelectedValue;
    Page.Response.Redirect("mypage.aspx?test=" + Session["NewSelection"].ToString());
}

注1 。这些指令用于防止ddl1从会话变量中获取旧索引。因此,在我选择ddl1中的项目之后,首先进行回发。在此回发期间,ddl1从会话变量中获取旧索引,之后我的新选择将丢失。通过这些说明,我可以防止它。但除非主要问题得到解决,否则它没有任何区别。

1 个答案:

答案 0 :(得分:0)

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
{ 
    ddl1.Items.Add("1");
    ddl1.Items[0].Value = "1";
    ddl1.Items.Add("2");
    ddl1.Items[1].Value = "2";
    ddl1.Items.Add("3");
    ddl1.Items[2].Value = "3";

    if (Session["NewSelection"] != null) // see note 1
    {
        string itemValue = Session["NewSelection"].ToString();
        ddl1.SelectedIndex = ddl1.Items.IndexOf(ddl1.Items.FindByValue(itemValue));
        Session["NewSelection"] = null; // see note 1
    }
}
}