web-dev-qa-db-fra.com

Lier le dictionnaire au répéteur

J'ai un objet dictionnaire <string, string> et souhaite le lier à un répéteur. Cependant, je ne sais pas quoi mettre dans le balisage aspx pour afficher réellement la paire clé-valeur. Il n'y a pas d'erreurs levées et je peux le faire fonctionner avec un List. Comment afficher un dictionnaire dans un répéteur?

40
XSL

Une IDictionary<TKey,TValue> est aussi un ICollection<KeyValuePair<TKey, TValue>>.

Vous devez vous lier à quelque chose comme (non testé):

((KeyValuePair<string,string>)Container.DataItem).Key
((KeyValuePair<string,string>)Container.DataItem).Value

Notez que l'ordre dans lequel les articles sont retournés n'est pas défini. Ils peuvent bien être renvoyés dans l'ordre d'insertion des petits dictionnaires, mais cela n'est pas garanti. Si vous avez besoin d'une commande garantie, SortedDictionary<TKey, TValue> trie par clé.

Ou si vous avez besoin d'un ordre de tri différent (par exemple par valeur), vous pouvez créer un List<KeyValuePair<string,string>> de vos paires clé-valeur, puis triez-le et liez-le à la liste triée.

Answer: J'ai utilisé ce code dans le balisage pour afficher la clé et la valeur individuellement:

<%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Key") %>
<%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Value") %>
46
Joe

<%# Eval("key")%> a fonctionné pour moi.

32
Arun Krish

Liez à la collection de valeurs du dictionnaire.

myRepeater.DataSource = myDictionary.Values
myRepeater.DataBind()
11
Jason Berkan

Écrivez une propriété dans votre code-behind du type d'une entrée dans votre dictionnaire lié. Disons, par exemple, que je lie un Dictionary<Person, int> à mon répéteur. J'écrirais (en C #) une propriété comme celle-ci dans mon code-behind:

protected KeyValuePair<Person, int> Item
{
    get { return (KeyValuePair<Person, int>)this.GetDataItem(); }
}

Ensuite, à mon avis, je peux utiliser des segments de code comme celui-ci:

<span><%# this.Item.Key.FirstName %></span>
<span><%# this.Item.Key.LastName %></span>
<span><%# this.Item.Value %></span>

Cela rend le balisage beaucoup plus propre. Et même si je préfère des noms moins génériques pour les valeurs référencées, je sais que Item.Key est un Person et Item.Value est un int et ils sont fortement typés comme tels.

Vous pouvez (lire: devrait), bien sûr, renommer Item en quelque chose de plus symbolique d'une entrée dans votre dictionnaire. Cela seul permettra de réduire toute ambiguïté dans la dénomination dans mon exemple d'utilisation.

Rien ne vous empêche certainement de définir une propriété supplémentaire, par exemple:

protected Person CurrentPerson
{
    get { return ((KeyValuePair<Person, int>)this.GetDataItem()).Key; }
}

Et en l'utilisant ainsi dans votre balisage:

<span><%# this.CurrentPerson.FirstName %></span>

... rien ne vous empêche également d'accéder à l'entrée de dictionnaire correspondante .Value.

2
JMD