2010-02-16 17 views
38

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 un List. ¿Cómo puedo obtener un diccionario para mostrar en un repetidor?Enlazar diccionario al repetidor

Respuesta

42

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

que necesita vincular 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 artículos 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 enlazar a la lista ordenada.

respuesta: que utiliza este código en el marcado para mostrar la clave y el valor individual:

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

¿Hay alguna manera de devolver los artículos en cierto orden? En mi lista (muy breve) de 4 elementos, se devuelven en el orden en que se colocaron. – XSL

+0

Eso parece una gran sobrecarga sin razón en .net ..... – Spacemonkey

10

Enlace a la colección de valores del diccionario.

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

Gracias. Me gustaría mostrar las claves y los valores, así que acabo de usar 'myDictionary'. En el marcado, utilicé '<% # Container.DataItem.ToString()%>'.Esto funciona, pero muestra tanto la clave como el valor como un "elemento". ¿Hay alguna forma de obtener la 'clave' y el 'valor' individualmente, para que puedan formatearse por separado? – XSL

+2

Sí. Los objetos en un diccionario son KeyValuePairs, por lo que puede convertir DataItem como Joe muestra en su respuesta. –

27

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

+1

¡Funciona muy bien !: <% # Eval ("clave")%> y también <% # Eval ("value")%> – GibboK

+0

Excepto ... Encontré que usar <% # Eval ("clave")%> devolvía el valor minúsculo. Por lo tanto, al necesitar conservar la fuente de la clave, tuve que seguir con List >. – David

1

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. Me gustaría escribir (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 esto:

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

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

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

Ciertamente no hay nada que le impida la definición de una propiedad adicional, dicen así:

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

Y usarlo en su margen de beneficio de esta manera:

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

... ninguno de los cuales evita También puede acceder a la entrada del diccionario correspondiente .Value.

Cuestiones relacionadas