seleccionar - Los formularios web ASP.NET DropDownList tiene un SelectedValue que no es válido porque no existe en la lista de elementos
seleccionar un valor de un dropdownlist c# (6)
En primer lugar, ha habido preguntas ( DropDownList tiene un SelectedValue que no es válido porque no existe en la lista de elementos , DropDownList "tiene un SelectedValue que no es válido porque no existe en la lista de elementos" , asp: DropDownList Error : ''DropDownList1'' tiene un SelectedValue que no es válido porque no existe en la lista de elementos ) sobre esto y hay soluciones propuestas, pero mi pregunta es realmente POR QUÉ sucede esto. Lo que es más, no estoy satisfecho con las soluciones sugeridas y las encuentro bastante feas.
Así que hay una página con una lista desplegable y un botón:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="TestWebApplication.WebForm2" ViewStateMode="Disabled" %>
<html lang="en" >
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="ddlTest" runat="server">
</asp:DropDownList>
<asp:Button Text="Test" ID="btnTest" runat="server" onclick="btnTest_Click" />
</div>
</form>
</body>
</html>
Enlazo ddlTest con algunos elementos en Page_Init y luego en btnTest_Click vuelvo a enlazar:
using System;
namespace TestWebApplication
{
public partial class WebForm2 : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
ddlTest.DataSource = new[] { 1, 2, 3 };
ddlTest.DataBind();
ddlTest.SelectedValue = "3";
}
protected void btnTest_Click(object sender, EventArgs e)
{
//SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
ddlTest.ClearSelection();
//SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
ddlTest.SelectedIndex = -1; //Nothing changes including SelectedIndex
ddlTest.SelectedValue = ""; //Nothing changes including SelectedValue
ddlTest.Items.Clear();
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
ddlTest.DataSource = null; //Nothing changes except for the DataSource property
ddlTest.DataSource = new[] { 1, 2 };
ddlTest.DataBind();//Exception!
//''ddlTest'' has a SelectedValue which is invalid because it does not exist in the list of items.
//Parameter name: value
}
}
}
¿Por qué tengo la excepción? Probé diferentes versiones de estos y ninguno de ellos funciona. Intenté usar solo ClearSelection pero sigo teniendo la misma excepción. Es este error en el control o algo que echo de menos. ¿Las soluciones alternativas feas de las otras preguntas son la única solución?
Nota: el error se puede reproducir incluso si se quita el botón y se mueve todo el código en un solo controlador de eventos. Solo enlace una vez establecido el valor seleccionado y enlace nuevamente.
¿Por qué tengo la excepción?
Después de llamar a Page_Init (), ddlTest se ha vinculado a 3 elementos: "1", "2" y "3". A continuación, establece SelectedValue en "3" y manipula todo tipo de cosas relacionadas con el control DropDownList. Pero el control aún está vinculado a la lista anterior : no ha vuelto a llamar a .DataBind () aunque haya cambiado las propiedades de DropDownList. La excepción se produce porque el control aún está vinculado a {1, 2, 3}, se aferra al anterior .SelectedValue y acaba de intentar .DataBind () en una lista que no incluye "3".
1) Como está escrito, su ejemplo realmente lanza una excepción en ddlTest.SelectedValue = "";
, ya que no hay ningún elemento en la colección con un Value
de "". Creo que esto se esperaría bajo cualquier circunstancia.
2) Obtengo una excepción cada vez que intento establecer el SelectedValue
o el SelectedIndex
de SelectedIndex
de la DDL en algo que SERÁ inválido en el momento en que se genere la DDL. Pero la excepción no se produce hasta que la colección DropDownList.Items
se cambie realmente, por ejemplo, con un DropDownList.Databind()
. Lo primero que hice fue hacer este cambio a Page_Init:
protected void Page_Init(object sender, EventArgs e)
{
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
if (!IsPostBack)
{
ddlTest.DataSource = new[] { 1, 2, 3 };
ddlTest.DataBind();
ddlTest.SelectedValue = "3";
}
}
Ahora lo que se vuelve interesante es que este primer ejemplo lanza una excepción, pero el segundo no lo hace. Ambos configuran un Valor de SelectedValue
que es válido en ese momento, pero el valor en el primer ejemplo ("3") no será válido en el momento en que la página aparezca:
protected void btnTest_Click(object sender, EventArgs e)
{
//SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
ddlTest.SelectedValue = "3";
//SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
ddlTest.ClearSelection();
//SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
ddlTest.Items.Clear();
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
ddlTest.DataSource = null;
ddlTest.DataSource = new[] { 1, 2 };
ddlTest.DataBind(); //Exception!
//''ddlTest'' has a SelectedValue which is invalid because it does not exist in the list of items.
//Parameter name: value
}
protected void btnTest_Click(object sender, EventArgs e)
{
//SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3} (from viewstate)
ddlTest.SelectedValue = "2";
//SelectedIndex is 1, SelectedValue is "2", SelectedItem is {3}
ddlTest.ClearSelection();
//SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
ddlTest.Items.Clear();
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
ddlTest.DataSource = null;
ddlTest.DataSource = new[] { 1, 2 };
ddlTest.DataBind(); //No Exception...
}
Entonces, ¿qué conclusión podemos sacar de esto? Bueno, parece que el problema se debe a la configuración de la propiedad SelectedIndex
o SelectedValue
de la DDL antes de que el contenido de la DDL pueda cambiarse en el mismo ciclo de la página. Si el valor establecido anteriormente todavía está disponible en los nuevos contenidos de DropDownList.Items
, está en el negocio. Pero si no está ahí, obtendrás una excepción.
Supongo que esto tiene algo que ver con la seguridad del hilo, pero no soy un experto en eso, así que espero que alguien pueda comentar.
Debido a que no hay ninguna fuente de datos cuando se recarga su página (se produjo la devolución), debe agregar el control SqlDataSource en su archivo .aspx, incluso en la página de recarga, reconocer la fuente de datos de DropDownList. Luego puede usar InsertCommand, UpdateCommand, DeleteCommand y SelecCommand para obtener su base de datos.
En mi caso tuve DropdownList
en el campo de templatedfield
de gridview
. Ahora el datasource
de datasource
de la cuadrícula tenía el elemento employeeid
. Tengo esto en el procedimiento almacenado, isnull(employeeid,0)
para la fuente de datos y adivino qué DropdownList
no tiene un valor de 0 en sus elementos; así que cambié eso a isnull (employeeid, 1) porque el primer elemento en DropdownList
tiene employeeid =1
y esto resolvió el problema
He enviado un error en Connect para el problema. Se resolvió como "No se solucionará", lo que en mi opinión significa que en realidad es un error. Se proporcionó una solución:
ddlTest.Items.Clear();
ddlTest.SelectedValue = null;
Considero esto como la respuesta.
Tuve un problema similar y lo arreglé agregando un método DataBinding.
protected void myDDL_DataBinding(object sender, EventArgs e)
{
if (myDDL.SelectedIndex != -1)
{
myDDL.SelectedIndex = 0;
}
}
En la página de diseño ...
<asp:DropDownList ID="myDDL" runat="server"
AutoPostBack="true" OnDataBinding="myDDL_DataBinding"
OnSelectedIndexChanged="myDDL_SelectedIndexChanged">
</asp:DropDownList>