2009-04-08 9 views
35

Tengo un 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 de datos, pero lo que sucede es que cada vez que se actualiza el panel de actualización, los elementos se agregan al DropDownList. Entonces, el DropDownList termina teniendo datos que son incorrectos o repetidos.DropDownList AppendDataBoundItems (primer elemento para estar en blanco y sin duplicados)

Tengo la propiedad AppendDataBoundItems establecida en true porque necesito el primer elemento para estar en blanco.

¿Cómo puedo solucionar este problema? ¿Hay alguna otra manera de tener un primer artículo en blanco?

(Esto es DropDownList en una aplicación web asp.net-2.0, y el código subyacente está en C#)

Gracias.

Respuesta

61

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> 

Luego, en su código detrás:

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

Gracias .. !! ¡Ayudó a – msbyuva

+0

Thnx! funciona como un amuleto – matskn

+0

¿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í). –

0

El código funciona, trate de darle un valor:

MyList.Items.Insert(0, new ListItem("- Select -", "0")); 
4

Es probable que se unen 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 
}; 
1
<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> 
0

He aquí una idea.

Hay una propiedad en la lista desplegable llamada AutoPostBack, configúrela en verdadero y luego en el código detrás de usted ponga todo el método de enlace dentro del if(!Page.IsPostBack). Eso funcionó para mí.

respetos.

2

Aquí es una idea, podemos utilizar 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(); 
} 
+0

La eliminación de la lista en la función MyListDataBinding es en realidad lo mismo que establecer AppendDataBoundItems = "false". –

3

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 -", "")); 
} 
0

apenas añade la 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> 
Cuestiones relacionadas