2010-02-17 54 views
4

我在代码隐藏中生成下拉列表,无法让selectedindexchanged事件自动触发。当直接放入ASPX页面时它工作正常,但我需要它在代码隐藏中。ASP.NET下拉列表Codebehind vs 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> 

回答

6

的问题可能是,如果你不加控制页面够早。需要在页面生命周期的早期阶段添加控件以获取事件绑定。

您可能在Load事件中执行此操作,这太迟了。尝试在Init事件中添加它或覆盖CreateChildControls方法。

编辑:正如Dave Swersky提到的,确保您在每页请求上都做这件事,包括回传。

+0

因此,因为我将它呈现给HTMLTexWriter,我会将它呈现给Init还是Load? – Alex 2010-02-17 16:52:44

+0

我把整个代码块放到page_init中,并且什么也没有发生 – Alex 2010-02-17 17:39:27

+0

比较Firebug或IE开发控制台中工作实现(标记)和非工作(代码)之间的标记。有些不同。 – 2010-02-17 20:34:58

2

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

例子:

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

然后在后面的代码(的Page_Load):

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)); 
} 
2

为了详细说明迈克·穆尼的回答是:你还需要确保你添加的控制反馈到控制树每回发一次每次回发时都会重新创建控制树,并从标记中读入。如果您以编程方式添加一次,并且再也不添加一次,则树中没有控制权来接收事件。

+0

谢谢戴夫。是的,我忽略提及这个非常重要的部分,无论是否回发,控件都需要始终创建。之前我也遇到过几次。 – 2010-02-17 15:27:06

0

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

0

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