2010-02-16 13 views
38

Mam obiekt słownikowy <string, string> i chcę go powiązać z repeateriem. Jednak nie jestem pewien, co umieścić w znacznikach aspx, aby faktycznie wyświetlić parę klucz-wartość. Nie są zgłaszane żadne błędy i mogę je uruchomić z List. Jak mogę uzyskać słownik do wyświetlenia w repeterze?Powiąż słownik dla repeatera

Odpowiedz

42

IDictionary<TKey,TValue> jest również ICollection<KeyValuePair<TKey, TValue>>.

trzeba wiązać się coś takiego (niesprawdzone):

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

Zauważ, że kolejność w jakiej są zwracane elementy jest niezdefiniowany. Mogą zostać zwrócone w zamówieniu reklamowym dla małych słowników, ale nie jest to gwarantowane. Jeśli potrzebujesz gwarantowanego zamówienia, sortuj według klucza.

Jeśli potrzebujesz innej kolejności sortowania (np. Według wartości), możesz utworzyć List<KeyValuePair<string,string>> par klucz-wartość, posortować ją i powiązać z posortowaną listą.

Odpowiedź: Kiedyś ten kod w znacznikach, aby wyświetlić klucz i wartość indywidualnie:

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

Czy istnieje sposób zwrotu przedmiotów w określonej kolejności? W mojej (bardzo krótkim teście) liście 4 przedmiotów są one zwracane w kolejności, w jakiej zostały umieszczone. – XSL

+0

To wygląda na dużo narzutów bez powodu w .net ..... – Spacemonkey

10

Powiąż zbiór wartości w słowniku.

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

Dzięki. Chciałbym wyświetlić klawisze i wartości, więc użyłem po prostu 'myDictionary'. W znaczniku użyłem '<% # Container.DataItem.ToString()%>.Działa to, ale pokazuje zarówno klucz, jak i wartość jako jeden "przedmiot". Czy istnieje sposób na uzyskanie "klucza" i "wartości" indywidualnie, aby można je było sformatować osobno? – XSL

+2

Tak. Obiekty w słowniku to KeyValuePairs, więc możesz rzucić DataItem jak Joe pokazuje w swojej odpowiedzi. –

27

<%# Eval("key")%> pracował dla mnie.

+1

Działa świetnie !: <% # Eval ("klucz")%>, a także <% # Eval ("wartość")%> – GibboK

+0

Z wyjątkiem ... Stwierdziłem, że użycie <% # Eval ("key")%> zwróciło małą wartość. Tak więc, chcąc zachować obudowę czcionki dla klucza, musiałem trzymać się listy >. – David

1

Wpisz właściwość w polu z kodem typu wpisu w powiązanym słowniku. Powiedzmy na przykład, że wiążę Dictionary<Person, int> z moim Repeater. Chciałbym pisać (w języku C#) właściwość jak to w moim kodu źródłowego:

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

Wtedy, moim zdaniem można używać segmentów kodu tak:

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

To sprawia, że ​​o wiele czystsze znaczników . I chociaż wolałbym mniej ogólnych nazw dla przywoływanych wartości, wiem, że Item.Key to Person i Item.Value jest int i są one mocno wpisane jako takie.

Możesz (czytaj: powinien), oczywiście, zmień nazwę na Item na coś bardziej symbolicznego niż wpis w słowniku. Samo to pomoże zmniejszyć wszelką niejednoznaczność w nazewnictwie w moim przykładzie użycia.

Jest z pewnością nic by uniemożliwić definiowania dodatkową właściwość, powiedzieć tak:

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

i używanie go w znacznikach wygląda następująco:

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

... o co zapobiega żaden możesz także uzyskać dostęp do odpowiedniego wpisu w słowniku: .Value.