c# - net - DropDownList AppendDataBoundItems(primer elemento para estar en blanco y sin duplicados)
items add new list item to dropdownlist (8)
Aquí hay buenas respuestas, pero sentí la necesidad de incluir más información porque existen múltiples opciones que funcionan y tenemos que decidir cuál usar.
Primero, debemos entender AppendDataBoundItems
. Si AppendDataBoundItems = "true"
, se agregan ListItems
a DropDownList
sin borrar los antiguos. De lo contrario, DropDownList
se borrará antes del próximo DataBind
. MSDN AppendDataBoundItems doc
Básicamente hay 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.
Observe 3 cosas aquí:
- Blank
ListItem
se define en html -
AppendDataBoundItems="true"
-
DataBind
NO se invoca en las devoluciones de datos o cuando el recuento de elementosDropDownList
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 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 la comprobación de 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 usar IsPostBack
en IsPostBack
lugar)
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 de la primera opción:
-
AppendDataBoundItems="false"
(si no está definido, entoncesfalse
es su valor predeterminado) - Blank
ListItem
se agrega en el código detrás. No podemos definirlo en html porque conAppendDataBoundItems="false"
, se eliminará. - Se llama a
DataBind
en cadaPage_Load
Fuente:
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
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 -", ""));
}
Tengo una DropDownList
dentro de un UpdatePanel
que se rellena en la devolución de datos desde un SqlDataSource
. Tiene un parámetro que es otro control. A veces necesito varias devoluciones, pero lo que sucede es que cada vez que se actualiza el panel de actualización, los elementos se agregan a DropDownList
. Entonces DropDownList
termina teniendo datos que son incorrectos o repetidos.
Tengo la propiedad AppendDataBoundItems
establecida en true
porque necesito que el primer elemento esté en blanco.
¿Cómo puedo superar este problema? ¿Hay alguna otra manera de tener un primer artículo en blanco?
(Esta DropDownList
está en una aplicación web asp.net-2.0, y codebehind está en c #)
Gracias.
Aquí hay una idea, podemos usar 2 eventos: DataBound y DataBinding :
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
protected void MyListDataBinding(object sender, EventArgs e)
{
MyList.Items.Items.Clear();
}
Aquí hay una idea.
Hay una propiedad en la lista desplegable llamada AutoPostBack
establece en verdadero y luego en el código detrás de usted pone todo el método de enlace dentro de if(!Page.IsPostBack)
. Eso funcionó para mí.
Saludos.
El código funciona, intenta darle un valor:
MyList.Items.Insert(0, new ListItem("- Select -", "0"));
En lugar de utilizar AppendDataboundItems=''true''
(que causará el problema del que está hablando), responda al evento DataBound
para DropDownList
y luego agregue su elemento "en blanco" al principio de la lista.
<asp:DropDownList runat="server" ID="MyList"
ondatabound="MyListDataBound"></asp:DropDownList>
Luego en tu código detrás:
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
Probablemente enlazará esa DropDownList en el código detrás. Entonces no deberías hacerlo después de la postback nuevamente:
// probably in Page_Load method
if (!Page.IsPostBack)
{
// do data binding here
};
Simplemente agregue EnableViewState = "false" a la etiqueta desplegable
<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource"
DataTextField="Name" DataValueField="ID" EnableViewState="false"
AppendDataBoundItems="true">
<asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server"
DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state">
<asp:ListItem Text="(Select a State)" Value="" />
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"
SelectCommand="SELECT DISTINCT [state] FROM [authors]">
</asp:SqlDataSource>