asp.net

asp.net - asp: DropDownList Error: ''DropDownList1'' tiene un SelectedValue que no es válido porque no existe en la lista de elementos



(8)

Tengo un sitio web asp.net 2.0 con numerosos asp: controles DropDownList. El control DropDownList contiene la información estándar de ciudad, estado, condado, etc ... información. Además de los códigos estándar, el sitio también tiene códigos personalizados que los usuarios pueden configurar ellos mismos. Por ejemplo, un menú desplegable de animales puede contener los valores Dog, Cat, Fish, ect ...

Estoy seleccionando DropDownList desde una tabla de SQL 2005 que creé, por ejemplo tblCodes

Todo funciona muy bien y los usuarios pueden agregar pedidos utilizando los numerosos controles DropDownList para elegir elementos de la lista.

El problema ocurre si un usuario quiere cambiar uno de sus desplegables personalizados. Por ejemplo, un usuario desea cambiar el verbage en un control de tipo de animal de Dog a K9. Aquí es donde empieza el problema.

Para todas las nuevas órdenes, el menú desplegable funciona bien. Cuando el usuario recuperó una orden anterior, recibí el siguiente error en el código C # detrás de "''DropDownList1'' tiene un SelectedValue que no es válido porque no existe en la lista de elementos."

Lo que está sucediendo es que el pedido anterior tiene un valor de campo de base de datos de Dog y DropDownList ya no tiene Dog en su lista ya que el usuario lo cambió a K9.

¿Alguna idea sobre una solución alternativa?
¿Hay alguna manera de hacer el asp: DropDownList acepta artículos no incluidos en su lista? ¿Hay algún otro control que pueda usar?


Su SelectedValue debe ser una identificación única de algún tipo, eso no cambia. El valor de texto que se muestra al usuario es algo separado, y puede cambiar si es necesario sin afectar su aplicación, porque asocia el ID con su orden, no el valor de cadena mostrado.


No estoy seguro de que sea el mismo problema, pero tuve un problema de sonido similar al tratar de vincular un DropDownList que quería contener en un GridView. Cuando miré a mi alrededor encontré que mucha gente hacía preguntas similares, pero no soluciones robustas. Leí informes contradictorios sobre si podría interceptar eventos de enlace de datos, etc. Intenté la mayoría de ellos, pero no pude encontrar una forma de interceptar o prevenir el error.

Terminé creando una subclase del ddl, interceptando el error desde allí pirateando un arreglo.

No estaba ordenado, pero funcionó para mis necesidades. Puse el código en mi blog en caso de que sea de ayuda. Texto del enlace


Resolví exactamente este mismo problema hace solo dos días. Primero, moví el código que establece SelectedValue a un controlador PreRender para DropDownList. Luego, agrego lógica a la primera verificación para ver si el valor está en la lista desplegable. Si no, lo agrego.

Aquí está mi código. ddSpecialty es mi lista desplegable, llena de "especialidades" de la base de datos. registration.Specialty es la especialidad que el usuario eligió, que puede estar o no en el menú desplegable, ya que esa especialidad en particular puede haber sido eliminada desde que la eligieron por última vez.

protected void ddSpecialty_PreRender(object sender, EventArgs e) { if (!ddSpecialty.Items.Contains(new ListItem(registration.Specialty))) ddSpecialty.Items.Add(registration.Specialty); ddSpecialty.SelectedValue = registration.Specialty; }


Me he encariñado mucho con el siguiente pequeño fragmento para establecer los valores de DropDownList:

Para no DataBound (por ejemplo, elementos agregados manualmente):

ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));

Para DataBound :

ddl.DataBound += (o,e) => ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));

Sin embargo, me gustaría que ListControls en general no arrojara errores cuando intentas establecer valores para algo que no está allí. Al menos en modo Release, hubiera sido bueno que esto muriera silenciosamente.



Me metí en esto yo mismo. Curiosamente, ddl.ClearSelection(); no funcionó Tuve que usar ddl.SelectedValue = null

También noté que esto debe venir DESPUÉS de borrar los ítems de la lista ddl.Items.Clear(); que también parece extraño Al establecer SelectedValue en nulo, al borrar los ítems aún arrojó el error.

Una vez hecho esto, vuelva a enlazar la lista y vuelva a seleccionar con un nuevo valor.


Prueba esto:

if (ddl.Items.Contains(new ListItem(selectedFacility))) ddl.SelectedValue = selectedFacility;


He hecho una solución después de tener este problema muy a menudo. Lamentablemente, la EM aún no recuperó este problema.

De todos modos, mi solución es la siguiente.

1) Ato los datos a la propiedad ToolTip de DropDownList

<asp:DropDownList ID="edtDepartureIDKey" runat="server" CssClass="textbox" ToolTip=''<%# Eval("DepartureIDKey") %>'' DataSource="<%# DLL1DataSource() %>" DataTextField="DisplayField" DataValueField="IDKey" onprerender="edtDepartureIDKey_PreRender">

2) En el evento de prerender verifico la disponibilidad de los datos, y si no está en la lista, simplemente lo agrego, luego establezco el índice seleccionado en el valor de datos que guardé en la propiedad ToolTip

protected void edtDepartureIDKey_PreRender(object sender, EventArgs e) { DropDownList ddl = (sender as DropDownList); if (ddl.Items.FindByValue(ddl.ToolTip) == null) { //I am pulling Departure Data through the ID which is saved in ToolTip, and insert it into the 1st row of the DropDownList TODepartureData v = new TODepartureData(DBSERVER.ConnStrName); TODeparture d = v.Select(Convert.ToInt32(ddl.ToolTip)); ddl.Items.Insert(0, new ListItem(d.DeptCode, ddl.ToolTip)); } ddl.Items.FindByValue(ddl.ToolTip).Selected = true; }