Привязать словарь к повторителю - PullRequest
39 голосов
/ 16 февраля 2010

У меня есть объект словаря <string, string>, и я хотел бы привязать его к повторителю. Тем не менее, я не уверен, что поместить в разметку aspx, чтобы фактически отобразить пару ключ-значение. Нет ошибок, и я могу заставить его работать с List. Как получить словарь для отображения в повторителе?

Ответы [ 4 ]

43 голосов
/ 16 февраля 2010

IDictionary<TKey,TValue> также является ICollection<KeyValuePair<TKey, TValue>>.

Вам необходимо привязать что-то вроде (не проверено):

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

Обратите внимание, что порядок, в котором элементы возвращаютсяне определеноОни могут быть возвращены в порядке вставки для небольших словарей, но это не гарантируется.Если вам нужен гарантированный заказ, SortedDictionary<TKey, TValue> сортирует по ключу.

Или, если вам нужен другой порядок сортировки (например, по значению), вы можете создать List<KeyValuePair<string,string>> из ваших пар ключ-значение, затем отсортировать его и связать с отсортированным списком.

Ответ : я использовал этот код в разметке для индивидуального отображения ключа и значения:

<%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Key") %>
<%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Value") %>
32 голосов
/ 10 мая 2010

<%# Eval("key")%> работал для меня.

11 голосов
/ 16 февраля 2010

Привязка к коллекции значений словаря.

myRepeater.DataSource = myDictionary.Values
myRepeater.DataBind()
1 голос
/ 15 марта 2016

Напишите в своем коде свойство типа записи в вашем ограниченном словаре. Скажем так, например, я привязываю Dictionary<Person, int> к своему репитеру. Я бы написал (в C #) свойство, подобное этому, в моем коде:

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

Тогда, на мой взгляд, я могу использовать такие сегменты кода, как это:

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

Это делает для более чистой разметки. И хотя я бы предпочел менее общие имена для ссылочных значений, я знаю, что Item.Key - это Person, а Item.Value - это int, и они строго типизированы.

Вы можете (читай: должен ), конечно, переименовать Item во что-то более символическое для записи в вашем словаре. Одно это поможет уменьшить двусмысленность именования в моем примере использования.

Конечно, ничто не мешает вам определить дополнительное свойство, скажем так:

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

И используя его в своей разметке, таким образом:

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

... ничего из этого не мешает вам также получить доступ к соответствующей записи словаря .Value.

...