new net llenar item dropdownlist datatextfield databind asp and agregar c# asp.net drop-down-menu webforms append

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 elementos DropDownList 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, entonces false es su valor predeterminado)
  • Blank ListItem se agrega en el código detrás. No podemos definirlo en html porque con AppendDataBoundItems="false" , se eliminará.
  • Se llama a DataBind en cada Page_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>