2009-08-12 10 views
26

Me acabo de encontrar con esta cosa extraña que esperaba trabajar de una manera diferente (lógica), pero no es así. Es un error o una característica"?Databind ASP.NET Lista de ListItem a DropDownList problema

Así que hay una DropDownList que estoy poblando en el código detrás de una Lista de ListItem. Cada nuevo ListItem recibe 2 argumentos que, según la documentación intelisense-proporcionado, se corresponden con su texto y valor:

List<ListItem> users = new List<ListItem>(); 
foreach (SubscriptionUser su in subscriptionDetails.UserList) 
{ 
    users.Add(new ListItem(su.FirstName + " " + su.LastName, su.EmailAddress)); 
} 
ddlPrimaryContact.DataSource = users; 
ddlPrimaryContact.DataBind(); 

Ahora, alguien me puede explicar por qué el DropDownList enlace de datos Tanto el texto como valor ajustado exactamente a la misma (el texto de ListItem) en lugar de usar ListItem.Text como el Texto y ListItem.Value como el Valor?

ARGH!! http://www.freeimagehosting.net/uploads/fe65d0e7d5.jpg

O estoy haciendo algo mal?

+0

Dado que ya está haciendo un bucle para crear su lista, ¿por qué no simplemente agrega cada elemento de la lista directamente a la lista desplegable? – ScottE

Respuesta

53

Hola cuando hay que enlazar datos (a cualquier cosa) con DataTextField y DataValueField de su DropDownList. En su caso se debe utilizar el siguiente código

List<ListItem> users = new List<ListItem>(); 
foreach (SubscriptionUser su in subscriptionDetails.UserList) 
{ 
    users.Add(new ListItem(su.FirstName + " " + su.LastName, su.EmailAddress)); 
} 
ddlPrimaryContact.DataTextField = "Text"; 
ddlPrimaryContact.DataValueField = "Value"; 
ddlPrimaryContact.DataSource = users; 
ddlPrimaryContact.DataBind(); 
+0

Gracias. Me di cuenta de esto mientras tanto. Supongo que estaba asumiendo que este "emparejamiento" se haría automáticamente, pero aparentemente estaba equivocado ... – Farinha

8

Debe vincular a su lista desplegable como:

ddlPrimaryContact.DataSource = users; 
ddlPrimaryContact.DataTextField = "Value"; 
ddlPrimaryContact.DataValueField = "Text"; 
ddlPrimaryContact.DataBind(); 

Si usted pregunta por qué, por lo que yo sé, los controles de enlace de datos se lleva a textos y valores (si no se suministran como se indicó anteriormente) llamando al método ToString para cada elemento en la recopilación del origen de datos. Entonces cada ListItem en su colección devuelve su propiedad Text por el método ToString.

5

O, como alternativa, podría vincularlo de esta manera. (Asumiendo que puede agregar una propiedad de solo lectura a SubscriptionUser llama NombreCompleto (que devuelve su.FirstName + "" + su.LastName)

ddlPrimaryContact.DataSource = subscriptionDetails.UserList; 
ddlPrimaryContact.DataBind(); 

entonces, en su página ASPX puesto:

<asp:DropDownList id="ddlPrimaryContact" runat="server" DataTextField="FullName" DataValueField="EmailAddress" /> 
+0

Ese es un método bastante limpio, es más intuitivo y fácil de mantener. Terminé usando este método, ya que seguía la estructura de mi objeto de clase existente para cada elemento de lista desplegable. – Bryan

5

le puede aslo añadir directamente a listitem desplegables ..

List<ListItem> users = new List<ListItem>(); 
     for (int count = 0; count < 10; count++) 
     { 
      ListItem li = new ListItem("List " + count.ToString(), count.ToString()); 
      ddl.Items.Add(li); 
     } 
5

Hay una manera de añadir elementos listItem a un DropDownList y tener .NET coincide automagicamente texto del listItem con el texto de la lista desplegable, y la sa yo por valor:

Cuestiones relacionadas