ASP.NET下拉列表在Codebehind vs在ASPX页面中

ASP.NET下拉列表在Codebehind vs在ASPX页面中,asp.net,drop-down-menu,code-behind,selectedindexchanged,Asp.net,Drop Down Menu,Code Behind,Selectedindexchanged,我正在codebehind中生成下拉列表,无法自动触发selectedindexchanged事件。它可以很好地工作时,直接放在ASPX页面,但我需要它在代码背后 这不起作用: var deptList = new DropDownList { ID = "deptList", DataSource = departments, DataTextField = "deptname", DataValueField = "de

我正在codebehind中生成下拉列表,无法自动触发selectedindexchanged事件。它可以很好地工作时,直接放在ASPX页面,但我需要它在代码背后

这不起作用:

var deptList = new DropDownList
    {
        ID = "deptList",
        DataSource = departments,
        DataTextField = "deptname",
        DataValueField = "deptid",
        AutoPostBack = true,
        EnableViewState = true
    };

deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged);
deptList.DataSource = departments;
deptList.DataTextField = "deptname";
deptList.DataValueField = "deptid";

if (!IsPostBack)
    deptList.DataBind();

deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty));

writer.Write("Select a department: ");
deptList.RenderControl(writer);
但这是可行的:

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server" OnSelectedIndexChanged="deptList_SelectedIndexChanged"></asp:DropDownList>

问题可能是您没有足够早地将控件添加到页面。需要在页面生命周期的早期添加控件,以便将其事件绑定在一起

您可能正在加载事件中执行此操作,但为时已晚。尝试在Init事件期间添加它或重写CreateChildControls方法


编辑:正如Dave Swersky提到的,确保在每个页面请求(包括回发)上都这样做。

您的代码中有一个网格。尝试设置创建、数据绑定和事件调用

例如:

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server"></asp:DropDownList>

详细说明Mike Mooney的答案:您还需要确保在每次回发时将控件添加回控件树。每次回发时都会从标记中读入控件树。如果以编程方式添加该控件一次,而不再添加,则树中没有控件可接收该事件。

您似乎没有将该控件添加到控件集合中。必须将控件添加到控件层次结构中的某个位置,并确保在每次回发时都添加该控件,以确保该控件存在以接收事件。通过添加控件,您不需要直接调用RenderControl。

我遇到的问题是,如果下拉列表没有AutoPostBack=true,那么它将永远不会调用该函数

谢谢你,戴夫。是的,我忽略了提到非常重要的一部分,不管是回发还是回发,都需要始终创建控件。我以前也曾多次这样做过。因此,既然我要将它呈现给HTMLTexWriter,我会在Init或Load中呈现它吗?我将整个代码块放入页面_Init中,但仍然没有发生任何事情。在Firebug或IE开发控制台中,比较工作实现(标记)和不工作(代码)之间的标记。有些不同。
deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged);

if (!IsPostBack)
{
     deptList.DataTextField = "deptname";
     deptList.DataValueField = "deptid";
     deptList.DataSource = departments;
     deptList.DataBind();
     deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty));
}