Posterior a buscar en diversos repositorios y foros de internet al final hallamos la resolución que te mostramos más adelante.
Solución:
En lugar de usar AppendDataboundItems='true'
(que causará el problema del que está hablando), responda a la DataBound
evento para el DropDownList
y luego agregue su elemento “en blanco” al principio de la lista.
Luego, en su código detrás:
protected void MyListDataBound(object sender, EventArgs e)
MyList.Items.Insert(0, new ListItem("- Select -", ""));
Aquí hay buenas respuestas, pero sentí la necesidad de incluir más información porque hay múltiples opciones que funcionan y debemos decidir cuál usar.
Primero, debemos entender AppendDataBoundItems
. Si AppendDataBoundItems = "true"
, ListItems
se agregan a la DropDownList
sin limpiar los viejos. De lo contrario, el DropDownList
se aclara antes del próximo DataBind
. Documento MSDN AppendDataBoundItems
Hay básicamente 2 opciones cubiertas por la mayoría de las respuestas:
1. Defina una opción en blanco en html y agregue ListItems de la base de datos a DropDownList solo una vez.
Note 3 cosas aquí:
- Espacio en blanco
ListItem
se define en html AppendDataBoundItems="true"
DataBind
NO se llama en devoluciones de datos o cuando elDropDownList
el recuento de elementos es > 1
Fuente:
Código detrás:
protected void Page_Load(object sender, System.EventArgs e)
if (MyList.Items.Count <= 1 )
MyList.DataSource = MyDataSource;
MyList.DataBind();
Nota: me gusta la lógica de verificar el conteo frente a verificar IsPostBack
. Aunque los PostBack son a menudo la causa del enlace de datos duplicado, es posible causarlo de otras maneras. Verificar el conteo de elementos es básicamente solo verificar si ya se cargó.
O (opción de usar IsPostBack
en cambio)
protected void Page_Load(object sender, System.EventArgs e)
if (!IsPostBack)
MyList.DataSource = MyDataSource;
MyList.DataBind();
2. Borre y vuelva a cargar DropDownList en cada actualización de página.
Note 3 diferencias con la primera opción:
AppendDataBoundItems="false"
(si no está definido entoncesfalse
es su valor predeterminado)- Espacio en blanco
ListItem
se agrega en el código detrás. No podemos definirlo en html porque conAppendDataBoundItems="false"
se borraría. DataBind
se llama cadaPage_Load
Fuente:
Código detrás:
protected void Page_Load(object sender, System.EventArgs e)
MyList.DataSource = MyDataSource;
MyList.DataBind();
protected void MyList_DataBound(object sender, EventArgs e)
MyList.Items.Insert(0, new ListItem("- Select One -", ""));
Probablemente vincules esa DropDownList en el código subyacente. Por lo tanto, no debe volver a hacerlo después de la devolución de datos:
// probably in Page_Load method
if (!Page.IsPostBack)
// do data binding here
;