onselectedindexchanged net funciona example dropdownlist drop down change asp c# asp.net drop-down-menu custom-server-controls selectedindexchanged

c# - net - dropdownlist selectedindexchanged no funciona



ASP.NET/C#: DropDownList SelectedIndexChanged en el control del servidor no se activa (5)

¿Viewstate está encendido?

Editar: Quizás debería reconsiderar anular la función de representación

protected override void RenderContents(HtmlTextWriter output) { ddlCountries.RenderControl(output); ddlStates.RenderControl(output); }

y en su lugar, agregue las listas desplegables al control y represente el control utilizando los RenderContents predeterminados.

Editar: vea la respuesta de Dennis a la que aludí en mi comentario anterior:

Controls.Add ( ddlCountries ); Controls.Add ( ddlStates );

Estoy creando un control de servidor que básicamente vincula dos listas desplegables, una para el país y otra para el estado, y actualiza el menú desplegable de estado en el evento de cambio de índice seleccionado del país. Sin embargo, no se está publicando. ¿Alguna idea de por qué? Puntos de bonificación para envolverlos en un UpdatePanel (que tiene problemas de representación, tal vez porque no tengo una página para hacer referencia?)

Esto es lo que tengo (con algunas cosas adicionales de acceso a datos eliminadas):

public class StateProv : WebControl { public string SelectedCountry; public string SelectedState; private DropDownList ddlCountries = new DropDownList(); private DropDownList ddlStates = new DropDownList(); protected override void OnLoad(EventArgs e) { base.OnLoad(e); IList<Country> countries = GetCountryList(); IList<State> states = new List<State>(); if (SelectedCountry != null && SelectedCountry != "") { states = GetStateList(GetCountryByShortName(SelectedCountry).CountryShortName); } else { states.Add(new State { CountryId = 0, Id = 0, StateLabelName = "No states available", StateLongName = "No states available", StateShortName = "" }); } ddlCountries.DataSource = countries; ddlCountries.DataTextField = "CountryLongName"; ddlCountries.DataValueField = "CountryShortName"; ddlCountries.SelectedIndexChanged += new EventHandler(ddlCountry_SelectedIndexChanged); ddlCountries.AutoPostBack = true; ddlStates.DataSource = states; ddlStates.DataTextField = "StateLongName"; ddlStates.DataTextField = "StateShortName"; ddlCountries.DataBind(); ddlStates.DataBind(); if (!string.IsNullOrEmpty(SelectedCountry)) { ddlCountries.SelectedValue = SelectedCountry; if (!string.IsNullOrEmpty(SelectedState)) { ddlStates.SelectedValue = SelectedState; } } } protected override void RenderContents(HtmlTextWriter output) { ddlCountries.RenderControl(output); ddlStates.RenderControl(output); } private IList<Country> GetCountryList() { //return stuff } private IList<State> GetStateList(Country country) { //return stuff } private IList<State> GetStateList(string countryAbbrev) { Country country = GetCountryByShortName(countryAbbrev); return GetStateList(country); } private Country GetCountryByShortName(string countryAbbrev) { IList<Country> list = dataAccess.RetrieveQuery<Country>(); //return stuff } private IList<State> GetAllStates() { //return stuff } protected void ddlCountry_SelectedIndexChanged(object sender, EventArgs e) { IList<State> states = GetStateList(GetCountryList()[((DropDownList)sender).SelectedIndex]); ddlStates.DataSource = states; ddlStates.DataBind(); } }

Editar: Viewstate está en la página, y otros controles en la página realizan devoluciones de datos correctamente, simplemente no esto.


No veo que agregue estos controles a la jerarquía de control. Tratar:

Controls.Add ( ddlCountries ); Controls.Add ( ddlStates );

Los eventos no se invocarán a menos que el control sea parte de la jerarquía de control.


Primero, me gustaría aclarar algo. ¿No es esto una publicación posterior (viaje de regreso al servidor) que nunca ocurre, o es la publicación posterior, pero nunca entra en el controlador de eventos ddlCountry_SelectedIndexChanged?

No estoy seguro de qué caso está teniendo, pero si es el segundo caso, puedo ofrecer alguna sugerencia. Si es el primer caso, entonces lo siguiente es FYI.

Para el segundo caso (el controlador de eventos nunca se dispara aunque se haya realizado una solicitud), es posible que desee probar las siguientes sugerencias:

  1. Consulte el Request.Params [ddlCountries.UniqueID] y vea si tiene valor. Si lo tiene, ejecute manualmente el controlador de eventos.
  2. Mientras el estado de vista esté activado, solo vincula los datos de la lista cuando no se trate de una publicación posterior.
  3. Si el estado de vista tiene que estar desactivado, entonces ponga los datos de la lista vinculados en OnInit en lugar de OnLoad.

Tenga en cuenta que al llamar Control.DataBind (), ver estado y publicar información ya no estará disponible desde el control. En el caso de que el estado de vista esté activado, entre la publicación posterior, los valores de DropDownList se mantendrían intactos (la lista no se recuperará). Si emite otro DataBind en OnLoad, borrará sus datos de estado de vista, y el evento SelectedIndexChanged nunca se disparará.

En el caso de que el estado de vista esté desactivado, no tiene más remedio que volver a vincular la lista cada vez. Cuando se produce una publicación posterior, hay llamadas ASP.NET internas para completar el valor de Request.Params a los controles apropiados, y sospecho que suceden en ese momento entre OnInit y OnLoad. En este caso, al restaurar los valores de la lista en OnInit, el sistema activará los eventos correctamente.

Gracias por su tiempo leyendo esto, y les doy la bienvenida a todos a corregir si me equivoco.


AutoPostBack establecer AutoPostBack en true para el País DropDownList .

protected override void OnLoad(EventArgs e) { // base stuff ddlCountries.AutoPostBack = true; // other stuff }

Editar

Eché de menos que hubieras hecho esto. En ese caso, debe verificar que ViewState esté habilitado.


Tuve el mismo problema, pero lo solucioné configurando AutoPostBack como verdadero y en un panel de actualización establecí el desencadenador para el identificador de control de lista desplegable y el nombre del evento en SelectedIndexChanged, por ejemplo

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always" enableViewState="true"> <Triggers> <asp:AsyncPostBackTrigger ControlID="ddl1" EventName="SelectedIndexChanged" /> </Triggers> <ContentTemplate> <asp:DropDownList ID="ddl1" runat="server" ClientIDMode="Static" OnSelectedIndexChanged="ddl1_SelectedIndexChanged" AutoPostBack="true" ViewStateMode="Enabled"> <asp:ListItem Text="--Please select a item--" Value="0" /> </asp:DropDownList> </ContentTemplate> </asp:UpdatePanel>