c# asp.net data-binding dictionary repeater

c# - Enlazar diccionario a repetidor



asp.net data-binding (4)

Enlace a la colección de valores del diccionario.

myRepeater.DataSource = myDictionary.Values myRepeater.DataBind()

Tengo un objeto de diccionario <string, string> y me gustaría vincularlo a un repetidor. Sin embargo, no estoy seguro de qué poner en el marcado aspx para mostrar realmente el par clave-valor. No hay errores lanzados y puedo hacer que funcione con una List . ¿Cómo puedo obtener un diccionario para mostrar en un repetidor?


Escriba una propiedad en su código subyacente del tipo de una entrada en su diccionario encuadernado. Digamos, por ejemplo, que estoy vinculando un Dictionary<Person, int> a mi Repetidor. Escribiría (en C #) una propiedad como esta en mi código subyacente:

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

Entonces, en mi opinión, puedo usar segmentos de código como este:

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

Esto hace que el marcado sea mucho más limpio. Y aunque preferiría nombres menos genéricos para los valores a los que se hace referencia, sí sé que Item.Key es una Person y Item.Value es un int y están fuertemente tipados como tales.

Puede (leer: debería ), por supuesto, cambiar el nombre de Item a algo más simbólico de una entrada en su diccionario. Solo eso ayudará a reducir cualquier ambigüedad en el nombramiento en mi uso de ejemplo.

Ciertamente, no hay nada que le impida definir una propiedad adicional, digamos así:

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

Y usándolo en su marcado de esta manera:

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

... ninguna de las cuales le impide acceder también al valor .Value la entrada del diccionario correspondiente.


Un IDictionary<TKey,TValue> también es un ICollection<KeyValuePair<TKey, TValue>> .

Debe vincularse a algo así como (no probado):

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

Tenga en cuenta que el orden en que se devuelven los elementos no está definido. Se pueden devolver en el orden de inserción para diccionarios pequeños, pero esto no está garantizado. Si necesita una orden garantizada, SortedDictionary<TKey, TValue> ordena por clave.

O si necesita un orden de clasificación diferente (por ejemplo, por valor), puede crear un List<KeyValuePair<string,string>> de sus pares clave-valor, luego ordenarlo y vincularlo a la lista ordenada.

Respuesta : Utilicé este código en el marcado para mostrar la clave y el valor de forma individual:

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


<%# Eval("key")%> funcionó para mí.