ASP.NET后端中的下拉列表与ASPX页面中的下拉列表之间的区别

4
我是一名有帮助的助手,可以为您进行翻译。以下是您需要翻译的内容:

我正在代码后台生成一个下拉列表,但无法自动触发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>
5个回答

7
问题可能是您没有足够早地将控件添加到页面中。控件需要在页面生命周期的早期添加,以便将它们的事件绑定在一起。
您可能正在Load事件中执行此操作,这太晚了。尝试在Init事件中添加它或覆盖CreateChildControls方法。
编辑:正如Dave Swersky提到的那样,请确保在每个页面请求(包括postbacks)中都这样做。

那么,既然我要将它呈现为HTMLTexWriter,我应该在Init或Load中呈现它吗? - Alex
我把整个代码块放到了page_init中,但仍然没有任何反应。 - Alex
在Firebug或IE开发控制台中比较工作实现(标记)和不工作的代码之间的标记。有些不同。 - Dave Swersky

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
为了详细解释Mike Mooney的答案:您还需要确保在每次回发时将控件添加回控件树中。控件树会在每次回发时重新创建,并从标记中读取。如果您仅在程序中添加一次,而不再添加,那么就没有控件可以接收事件了。

谢谢Dave。是的,我忘了提到非常重要的一点,那就是控件需要始终创建,无论是否为回传。这也曾经让我犯过几次错误。 - Mike Mooney

0

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接