net example ejemplos dropdownlist asp c# asp.net drop-down-menu selectedindex

example - c#ASP.Net DropDownList dinámicamente poblado pierde el índice seleccionado en el botón de envío



dropdownlist c# example (9)

Si enlaza los elementos de la lista desplegable en OnInit, todo el estado de la vista será manejado automáticamente por el marco. Si lo vincula en Page_Load, no los va a agregar hasta que viewstate ya esté aplicado. Muévelo a OnInit y no tendrá que preocuparse por ello.

Completo dinámicamente una lista desplegable de los 50 estados de una ArrayList en PageLoad. Cuando el usuario selecciona el botón ENVIAR (evento btnSubmit_Click), la propiedad SelectedIndex del control de lista desplegable siempre es 0 a pesar de la selección que el usuario seleccione.

Se agregó más código para ayudar a solucionar problemas. Obtener un -1 tanto de la variable de sesión (bbb) como del ddlState.selectedindex (bbb).

Código HTML en forma:

<asp:DropDownList ID="ddlState" runat="server" AutoPostBack="True" onselectedindexchanged="ddlState_SelectedIndexChanged" > </asp:DropDownList>

Código detrás:

protected void Page_Load(object sender, EventArgs e) { //------------------------------------------------ // Populates state dropdownlists //------------------------------------------------ if (!IsPostBack) { GetAllStatesForDdl(ddlDLState); GetAllStatesForDdl(ddlOldState); GetStatesForDdl(ddlState); } } private void GetAllStatesForDdl(DropDownList ddlStateList) { AppInputFormProcessor getStates = new AppInputFormProcessor(); ArrayList States = new ArrayList(); States = getStates.GetAllStates(); ddlStateList.DataSource = States; ddlStateList.DataBind(); } private void GetStatesForDdl(DropDownList ddlStateList) { AppInputFormProcessor getStates = new AppInputFormProcessor(); ArrayList States = new ArrayList(); States = getStates.GetStates(); ddlStateList.DataSource = States; ddlStateList.DataBind(); } protected void btnSubmit_Click(object sender, EventArgs e) { int aaa = ddlState.SelectedIndex; int bbb = Convert.ToInt32(Session["ddlState"]); } protected void ddlState_SelectedIndexChanged(object sender, EventArgs e) { Session["ddlState"] = ddlState.SelectedIndex; }


En primer lugar, deberá completar y buscar datos en la lista solo en una if( !IsPostBack ) { ...

Siguiente - La sesión ["ddlState"] nunca se está llenando, no está seguro de dónde desea rellenar esto, pero puede hacerlo en el índice seleccionado como ha indicado. esto debería funcionar si no está llamando a DataBind () en la devolución de datos.


En su ejemplo, está tratando de obtener el valor seleccionado de una variable de sesión, pero no se muestra ningún código que realmente establezca algo en la sesión.

Incluso si tiene algún tipo de llamada asincrónica que establece una variable de sesión, esta es una práctica muy peligrosa: tan pronto como alguien abre una segunda pestaña, se arriesga a la posibilidad de corrupción de datos.


Esto debería funcionar para ti. Sin embargo, estoy un poco confundido acerca de por qué está pasando el menú desplegable a la función para obtener los estados. ¿Tienes múltiples listas desplegables para llenar? Creo que necesitamos ver tu html para ser de más ayuda.

protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) GetStatesForDdl(ddl); } private void GetStatesForDdl(DropDownList ddlStateList) { AppInputFormProcessor getStates = new AppInputFormProcessor(); ArrayList States = new ArrayList(); States = getStates.GetStates(); ddlStateList.DataSource = States; ddlStateList.DataBind(); }


Qué tal esto:

protected void GetStatesForDdl(DropDownList ddlStateList) { //remove event handler ddlStateList.SelectedIndexChanged -= new EventHandler(ddlState_SelectedIndexChanged); //business as usual AppInputFormProcessor getStates = new AppInputFormProcessor(); ArrayList States = new ArrayList(); States = getStates.GetStates(); ddlStateList.DataSource = States; ddlStateList.DataBind(); // then force it to select desired index ddlStateList.SelectedIndex = (int)Session["ddlState"]; //ok, stick it back to control ddlStateList.SelectedIndexChanged += new EventHandler(ddlState_SelectedIndexChanged); }

Sugiero el uso de variables locales en ViewState en lugar de Session y SelectedValue en lugar de SelectedIndex.


Cuando tuve problemas con ViewState (eso es lo que sospecho en su caso) l usé esto para restaurar datos en un objeto desplegable dinámicamente poblado

public void Page_Load(object sender, EventArgs e){ if (!IsPostBack) { Databind(); } else { LoadAllViewStates(); } } private void Databind() { DataTable questionnaireDT = null; DataTable questionsDT = null; DataTable indicatorDT = null; DataView tempView = QuestionnaireDS.Select(DataSourceSelectArguments.Empty) as DataView; questionnaireDT = tempView.Table; ViewState["QuestionnaireDL"] = questionnaireDT; QuestionnaireDL.DataSource = ViewState["QuestionnaireDL"]; QuestionnaireDL.DataBind(); tempView = QuestionDS.Select(DataSourceSelectArguments.Empty) as DataView; questionsDT = tempView.Table; ViewState["QuestionList"] = questionsDT; QuestionList.DataSource = ViewState["QuestionList"]; QuestionList.DataBind(); tempView = IndicatorDS.Select(DataSourceSelectArguments.Empty) as DataView; indicatorDT = tempView.Table; ViewState["IndicatorLst"] = indicatorDT; IndicatorLst.DataSource = ViewState["IndicatorLst"]; IndicatorLst.DataBind(); } private void LoadAllViewStates() { QuestionnaireDL.DataSource = ViewState["QuestionnaireDL"]; QuestionnaireDL.DataBind(); QuestionList.DataSource = ViewState["QuestionList"]; QuestionList.DataBind(); IndicatorLst.DataSource = ViewState["IndicatorLst"]; IndicatorLst.DataBind(); }

Para restaurar el índice seleccionado, pasé el selectedIndex a un campo oculto.

¿Espero que esto ayude?

Por cierto, ¿por qué pasar el objeto DropDownList como parámetro? En su lugar, llame a una función sin parámetros y rellene el objeto DropDownList dentro de la función.

Además, asegúrese de que ViewState no esté apagado.


Esto podría ayudarte:

Mientras enlaza la lista desplegable, especifique las propiedades DataTextField y DataValueField. La razón para obtener el índice seleccionado como 0 durante el envío es porque el menú desplegable no contiene valores únicos asociados a cada elemento en él. Y recuerde que la propiedad especificada en DataValueField debe ser única. es decir, cada elemento en el menú desplegable debe ser identificable de manera única.

Por ejemplo, considere que la clase States se especifica de esta manera:

public class State { public string Name { get; set; } public string Id { get; set; } }

Ahora la lista desplegable debe estar vinculada como se indica a continuación. Aquí para cada elemento de estado, la propiedad ''Id'' es única.

ddlStateList.DataSource = States; ddlStateList.DataTextField = "Name"; ddlStateList.DataValueField = "Id"; ddlStateList.DataBind();


Si tiene ViewState deshabilitado, entonces tiene que guardar SelectedIndex en la sesión y en Page_Load, siempre vuelve a cargar los datos y establece el índice directamente. Cuando enlace el origen de datos, envíe el índice como parámetro para el índice predeterminado (de la sesión) y establezca SelectedIndex en este número después de llamar a DataBind ().


Cuando dice que no usa ViewState, ¿significa que lo tiene deshabilitado para la página o su lista desplegable? Ese podría ser tu problema. Sé que mucha gente te ha preguntado esto, pero no veo ninguna respuesta tuya que sugiera si estás usando ViewState. Cuando su usuario hace una selección y su página publica, aún necesita ViewState, por lo que su página sabe lo que el usuario selecciona incluso después de la publicación. Entonces depende de usted guardarlo en sesión o visualizar estado.

Por otro lado, si su viewstate está habilitado, agregue un fragmento de código en una nueva página para ver cuándo comienza a aparecer el problema. Recuerde no tocar viewstate e ir con el valor predeterminado. Para empezar, agregue una página con un menú desplegable y un botón, y agréguela a 2 valores ficticios y lea la selección del usuario en la publicación posterior. A medida que continúe agregando más código y controles, si el problema vuelve a aparecer, podrá descubrir qué línea de código le está causando dolor.

Espero que esto ayude.