Pregunta

estoy generando una lista desplegable en el código subyacente y no puedo conseguir el evento SelectedIndexChanged para disparar automáticamente. Funciona bien cuando se ponen directamente en la página ASPX, pero necesito que sea en el código subyacente.

Esto no funciona:

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

pero esto funciona:

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server" OnSelectedIndexChanged="deptList_SelectedIndexChanged"></asp:DropDownList>
¿Fue útil?

Solución

El problema puede ser si no va a agregar el control a la página con suficiente antelación. Los controles necesitan ser añadido al principio del ciclo de vida de la página para conseguir sus eventos vinculados en.

Probablemente se esté haciendo en el evento de carga, que es demasiado tarde. Trate de añadir que durante el evento Init o reemplazando el método CreateChildControls.

Editar:. Como se ha mencionado a Dave Swersky, asegúrese de hacer esto en cada solicitud de página incluyendo las devoluciones de datos

Otros consejos

Usted tiene una malla en el código. Trate de dividiremos la creación, el enlace de datos y eventos llamando.

Ejemplo:

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

A continuación, en el código subyacente (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));
}

Para más detalles sobre la respuesta de Mike Mooney: también hay que asegurarse de agregar el control de nuevo en el árbol de control en cada devolución de datos El árbol de control se recrea en cada devolución de datos, leer desde el margen de beneficio. . Si se agrega mediante programación una vez y nunca más, no hay control en el árbol para recibir el evento.

Parece que no va a agregar el control a la colección de controles. Debe agregar el control de algún lugar en la jerarquía de control y garantizar que se agrega en cada devolución de datos para asegurar el control existe para recibir el evento. Al añadir el control que no es necesario llamar directamente RenderControl.

El problema que tuve fue que si la lista desplegable no tenía AutoPostBack = true entonces sería no llamar a la función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top