valor seleccionar posicionar por poner net eventos ejemplos dropdownlist defecto asp asp.net webforms

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



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>