Hay buenas respuestas aquí, pero me sentí la necesidad de incluir más información porque hay múltiples opciones que trabajo y tenemos que decidir qué usar.
Primero, debemos entender AppendDataBoundItems
. Si se agregan AppendDataBoundItems = "true"
, ListItems
al DropDownList
sin borrar los antiguos. De lo contrario, se borrará el DropDownList
antes del siguiente DataBind
. MSDN AppendDataBoundItems doc
Hay básicamente 2 opciones cubiertas por la mayoría de las respuestas:
1. Definir una opción en blanco en html y añadir la ListItems de la base de datos para el DropDownList sola vez.
Aviso 3 cosas aquí:
- blanco
ListItem
se define en html
AppendDataBoundItems="true"
DataBind
no se llama en las devoluciones de datos o cuando el recuento DropDownList
elemento es> 1
Fuente:
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
Código atrá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 la comprobación de la cuenta de cheques vs IsPostBack
. Aunque los PostBacks son a menudo la causa de un enlace de datos duplicado, es posible causarlo de otras maneras. Verificar el recuento de artículos básicamente es verificar si ya se ha cargado.
O (opción de utilizar IsPostBack
lugar)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2. Borrar y volver a cargar el DropDownList en cada actualización de la página.
Aviso 3 diferencias con respecto a la primera opción:
AppendDataBoundItems="false"
(si no se define a continuación false
es que es valor por defecto)
- blanco
ListItem
se se añade en código detrás. No podemos definirlo en html porque con AppendDataBoundItems="false"
, se eliminará.
DataBind
se llama en cada Page_Load
Fuente:
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
Código atrá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 -", ""));
}
Gracias .. !! ¡Ayudó a – msbyuva
Thnx! funciona como un amuleto – matskn
¿Soy la única persona que tiene un problema con OnDataBound al encontrar el método que ha declarado que usa? No parece estar buscando en la parte posterior del código (a pesar de que todo DropDownList está poblado y creado allí). –