2010-02-16 4 views
38

Ich habe ein Wörterbuchobjekt <string, string> und möchte es an einen Repeater binden. Ich bin mir jedoch nicht sicher, was ich in das aspx Markup schreiben soll, um das Schlüssel-Wert-Paar tatsächlich anzuzeigen. Es gibt keine Fehler und ich kann es mit einer List arbeiten. Wie bekomme ich ein Wörterbuch in einem Repeater angezeigt?Bind-Wörterbuch zu Repeater

Antwort

42

Ein IDictionary<TKey,TValue> ist auch ein ICollection<KeyValuePair<TKey, TValue>>.

Sie müssen wie (nicht getestet), um etwas zu binden:

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

Beachten Sie, dass die Reihenfolge, in der die Elemente zurückgegeben werden, ist nicht definiert. Sie werden möglicherweise im Anzeigenauftrag für kleine Wörterbücher zurückgegeben, dies ist jedoch nicht garantiert. Wenn Sie eine garantierte Bestellung benötigen, sortiert SortedDictionary<TKey, TValue> nach Schlüssel.

Oder wenn Sie eine andere Sortierreihenfolge (z. B. nach Wert) benötigen, können Sie eine List<KeyValuePair<string,string>> Ihrer Schlüssel/Wert-Paare erstellen, sie dann sortieren und an die sortierte Liste binden.

Antwort: habe ich diesen Code in das Markup individuell den Schlüssel und Wert anzuzeigen:

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

Gibt es eine Möglichkeit, die Artikel in einer bestimmten Reihenfolge zurückzugeben? In meiner (sehr kurzen Test-) Liste von 4 Artikeln werden sie in der Reihenfolge zurückgegeben, in der sie platziert wurden. – XSL

+0

Das sieht wie viel Aufwand für keinen Grund in .net ..... – Spacemonkey

10

Bindung an die Wertesammlung des Wörterbuchs.

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

Danke. Ich möchte die Schlüssel und Werte anzeigen, also habe ich 'myDictionary' verwendet. Im Markup habe ich '<% # Container.DataItem.ToString()%>' verwendet.Dies funktioniert, aber es zeigt sowohl den Schlüssel als auch den Wert als einen "Gegenstand". Gibt es eine Möglichkeit, den "Schlüssel" und den "Wert" einzeln zu erhalten, sodass sie separat formatiert werden können? – XSL

+2

Ja. Die Objekte in einem Dictionary sind KeyValuePairs, so dass Sie das DataItem so darstellen können, wie Joe in seiner Antwort zeigt. –

27

<%# Eval("key")%> für mich gearbeitet.

+1

Works great !: <% # Eval ("Schlüssel")%> und auch <% # Eval ("Wert")%> – GibboK

+0

Ausgenommen ... Ich habe festgestellt, dass mit <% # Eval ("key")%> der Kleinbuchstabe zurückgegeben wurde. Also musste ich, um das Font-Gehäuse für den Schlüssel zu erhalten, bei List > bleiben. – David

1

Schreiben Sie eine Eigenschaft in Ihren Code-Behind des Typs eines Eintrags in Ihrem gebundenen Wörterbuch. Also sagen Sie zum Beispiel, ich bin eine Dictionary<Person, int> an meinen Repeater binden. Ich würde (in C#) eine Eigenschaft wie dies in meinem Code-Behind schreiben:

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

Dann meine Ansicht I-Code-Segmente wie folgt verwenden kann:

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

Diese für viele sauberen Markup macht . Und während ich für die referenzierten Werte weniger generische Namen bevorzugen würde, weiß ich, dass Item.Key ein Person und Item.Value ein int ist und sie als solche stark typisiert sind.

Sie können (lesen Sie: sollte), natürlich, benennen Sie Item zu etwas symbolischer von einem Eintrag in Ihrem Wörterbuch. Das allein wird dazu beitragen, Unklarheiten in der Benennung in meinem Beispiel zu vermeiden.

Es sicherlich nichts ist, Sie zu verhindern, dass eine zusätzliche Eigenschaft zu definieren, sagen wie folgt aus:

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

Und es in Ihrem Markup mit thusly:

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

... von denen keiner verhindert Sie können auch auf den entsprechenden Wörterbucheintrag .Value zugreifen.