Pregunta

Tengo un DropDownList dentro de un UpdatePanel que se rellena en la devolución de datos a partir de un SqlDataSource. Tiene un parámetro que es otro control. A veces necesito múltiples devoluciones de datos, pero lo que sucede es que cada vez que el panel de actualización refresca, los elementos se añade a la DropDownList. Por lo que el DropDownList termina por tener datos que es, o datos incorrectos repetidas.

Tengo la propiedad AppendDataBoundItems establecido en true porque necesito el primer elemento a estar en blanco.

¿Cómo puedo superar este problema? ¿Hay otra manera de tener un primer elemento en blanco?

(Esta DropDownList es en una aplicación web ASP.NET 2.0, y código subyacente es en C #)

¿Fue útil?

Solución

En lugar de utilizar AppendDataboundItems='true' (lo que hará que el problema que está hablando), responder al evento DataBound para la DropDownList y luego añadir su artículo "en blanco" a la parte superior de la lista.

<asp:DropDownList runat="server" ID="MyList"
  ondatabound="MyListDataBound"></asp:DropDownList>

A continuación, en su código detrás:

protected void MyListDataBound(object sender, EventArgs e)
{
    MyList.Items.Insert(0, new ListItem("- Select -", ""));
}

Otros consejos

Hay buenas respuestas aquí, pero me sentí la necesidad de incluir más información porque hay múltiples opciones que funcionan y que tienen que decidir cuál usar.

En primer lugar, debemos entender AppendDataBoundItems. Si AppendDataBoundItems = "true", ListItems se añaden a la DropDownList sin la limpieza de los antiguos. De lo contrario, el DropDownList se borra antes de la próxima DataBind. MSDN AppendDataBoundItems doc

Existen básicamente 2 opciones cubiertas por la mayoría de las respuestas:

1. Definir una opción en blanco en html y añadir los ListItems de la base de datos para el DropDownList sólo una vez.

Aviso 3 cosas aquí:

  • ListItem blanco se define en html
  • AppendDataBoundItems="true"
  • DataBind no se llama en las devoluciones de datos o cuando el elemento DropDownList El conteo 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. A pesar de las devoluciones de datos son a menudo la causa de enlace de datos por duplicado, es posible hacer que otras formas. Comprobación del número de elementos es, básicamente, sólo la comprobación para ver si ya se ha cargado.

O (opción de utilizar IsPostBack su 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, es que es false valor predeterminado)
  • ListItem blanco se se añade en código detrás. No podemos definirlo en html porque con AppendDataBoundItems="false", sería vació.
  • 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 -", ""));
}

Es probable que ates DropDownList en el código subyacente. Lo que no debería hacerlo después de la devolución de datos de nuevo:

// probably in Page_Load method
if (!Page.IsPostBack)
{
    // do data binding here
};

He aquí 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();
}
<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>

He aquí una idea.

Hay una propiedad en la lista desplegable llamada AutoPostBack ponemos a true y luego en el código detrás de uno pone todo el método de unión dentro de la if(!Page.IsPostBack). Eso funcionó para mí.

respecto.

Apenas añada 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top