Получить данные IGrouping в Repeater ItemDataBound - PullRequest
1 голос
/ 15 марта 2012

Я хочу сгруппировать новостные статьи по годам в репитере. Формат будет:

2010

список статей

2011

Список статей

Мой уровень доступа возвращает плоский список новостных статей, в частности, Список. Поэтому я группирую их и привязываю к репитеру следующим образом:

        events = DAL.GetEvents(); 
        var groupedNewsList = from e in events 
            group e by e.StoryDate.Year 
            into g 
            select new { 
                Year = g.Key
                , Events = g 
            };

        rptEvents.DataSource = groupedNewsList;
        rptEvents.DataBind(); 

Проблема заключается в попытке получить список из события ItemDataBound. Пока у меня есть следующее:

        var data = e.Item.DataItem;

        System.Type type = data.GetType();
        // getting the year works fine
        string year = (string)type.GetProperty("Year").GetValue(data, null).ToString();
        // this returns something, but I can't access any properties. I need to get 
        //access to the contained List<News>
        var newsList = type.GetProperty("Events").GetValue(data, null);

Есть идеи?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

У вас нет a List<News> - у вас просто есть группировка . Если вы хотите List<News>, вам нужно изменить свой запрос, например,

var groupedNewsList = from e in events
                      group e by e.StoryDate.Year into g
                      select new { Year = g.Key, Events = g.ToList() };

Обратите внимание, что если вы используете C # 4, вы могли бы сделать отражение гораздо проще, набрав dynamic:

dynamic data = e.Item.DataItem;
string year = data.Year.ToString();
List<News> newsList = data.Events;

В качестве альтернативы, вы могли бы в первую очередь избежать использования анонимного типа - создайте свой собственный тип GroupedNewsList со свойствами Year и Events, заполните его в своем запросе, а затем приведите к нему в обработчике событий.

1 голос
/ 08 сентября 2013

Объект «отправитель» в событии ItemDataBound является ретранслятором - используйте его для доступа к источнику данных. Если источник данных был сгруппирован до привязки, вы можете сравнить текущее значение с предыдущим значением и скрыть поле года, если они равны. Как это:

MyObject item = (MyObject)item.DataItem;
Repeater repeater = (sender as Repeater);
List<MyObject> items = repeater.DataSource as List<MyObject>;

Label lblGrouping = (Label)item.FindControl("lblGrouping");
if (item.ItemIndex == 0 || item.DateField.Year != items[item.ItemIndex - 1].DateField.Year) {
    lblGrouping.Text = item.DateField.Year.ToString();
}

Это сработало для меня, поскольку я использовал таблицу, в которой каждая строка представляла собой один элемент, а крайний левый столбец содержал элемент управления «lblGrouping».

...