在Repeater ItemDataBound中获取IGrouping数据

时间:2012-03-14 23:26:04

标签: linq repeater igrouping

我想在转发器中按年分组新闻报道。格式为:

2010

文章列表

2011

文章列表

我的访问层返回一个新闻文章的平面列表,特别是List。因此,我将它们分组并将它们绑定到Repeater,如下所示:

        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事件中获取List。到目前为止,我有以下内容:

        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 个答案:

答案 0 :(得分:3)

你没有拥有一个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;

或者,您可以首先避免使用匿名类型 - 使用GroupedNewsListYear属性创建自己的Events类型,在查询中填充该类型,然后转换为它在你的事件处理程序中。

答案 1 :(得分:1)

ItemDataBound事件中的“sender”对象是转发器 - 使用它来获取数据源。如果数据源在绑定之前已经分组,则可以将当前值与之前的值进行比较&amp;如果它们是平等的,则隐藏年份字段。像这样:

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”控件。