web-dev-qa-db-fra.com

Databind ASP.NET List of ListItem to DropDownList issue

Je viens de tomber sur cette chose bizarre à laquelle je m'attendais à travailler d'une manière (logique) différente, mais ce n'est pas le cas. Est-ce un bug ou une fonctionnalité"?

Il y a donc une DropDownList que je remplis dans le codebehind avec une List of ListItem. Chaque nouveau ListItem reçoit 2 arguments qui, selon la documentation fournie par intellisense, correspondent à son texte et à sa valeur:

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();

Maintenant, quelqu'un peut-il m'expliquer pourquoi la base de données DropDownList le texte et la valeur sont exactement identiques (le texte ListItem) au lieu d'utiliser ListItem.Text comme texte et ListItem.Value comme valeur?

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

Ou est-ce que je fais quelque chose de mal?

30
Farinha

Salut lors de la liaison de données (à quoi que ce soit), vous devez définir le DataTextField et DataValueField de votre DropDownList. Dans votre cas, vous devez utiliser le code suivant

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();
58
Matthew Dresser

Vous devez lier votre liste déroulante comme:

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

Si vous demandez pourquoi, à ma connaissance, les contrôles de databound prennent des textes et des valeurs (s'ils ne sont pas fournis comme ci-dessus) en appelant la méthode ToString pour chaque élément de la collection de sources de données. Ainsi, chaque ListItem de votre collection renvoie sa propriété Text par la méthode ToString.

9
Canavar

Ou, alternativement, vous pouvez le lier de cette façon. (En supposant que vous pouvez ajouter une propriété readOnly à SubscriptionUser appelée FullName (qui renvoie su.FirstName + "" + su.LastName)

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

puis, dans votre page ASPX mettez:

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

vous pouvez également ajouter directement listitem à la liste déroulante.

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
Muhammad Akhtar

Il existe un moyen d'ajouter des éléments ListItem à un DropDownList et de faire en sorte que .NET fasse correspondre automatiquement le texte du ListItem avec le texte du DropDownList, et la même chose pour Value:

List<ListItem> users = new List<ListItem>();
// fill in list
ddlUsers.Items.AddRange(users.ToArray());
5
Farinha