Linq 在Repeater ItemDataBound中获取I分组数据

Linq 在Repeater ItemDataBound中获取I分组数据,linq,repeater,igrouping,Linq,Repeater,Igrouping,我想把每年的新闻文章放在一个转发器里。格式为: 2010年 物品清单 2011年 物品清单 我的访问层返回一个新闻文章的平面列表,特别是列表。因此,我将它们分组并绑定到中继器,如下所示: events = DAL.GetEvents(); var groupedNewsList = from e in events group e by e.StoryDate.Year into g

我想把每年的新闻文章放在一个转发器里。格式为:

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);
var data=e.Item.DataItem;
System.Type=data.GetType();
//让这一年过得很好
字符串年份=(字符串)类型.GetProperty(“年份”).GetValue(数据,null).ToString();
//这将返回一些内容,但我无法访问任何属性。我需要去
//访问所含列表
var newsList=type.GetProperty(“事件”).GetValue(数据,null);
有什么想法吗

提前谢谢

您没有
列表
——您只有一个分组。如果您想要
列表
,则需要更改查询,例如:

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
typing可以更轻松地进行反射:

dynamic data = e.Item.DataItem;
string year = data.Year.ToString();
List<News> newsList = data.Events;
动态数据=e.Item.DataItem;
字符串year=data.year.ToString();
List newsList=data.Events;
或者,您可以首先避免使用匿名类型-使用
Year
Events
属性创建您自己的
GroupedNewsList
类型,在查询中填充该类型,然后在事件处理程序中对其进行强制转换。

您没有
列表
-您只有一个分组。如果您想要
列表
,则需要更改查询,例如:

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
typing可以更轻松地进行反射:

dynamic data = e.Item.DataItem;
string year = data.Year.ToString();
List<News> newsList = data.Events;
动态数据=e.Item.DataItem;
字符串year=data.year.ToString();
List newsList=data.Events;
或者,您可以首先避免使用匿名类型-使用
Year
Events
属性创建自己的
GroupedNewsList
类型,在查询中填充该类型,然后在事件处理程序中对其进行强制转换。

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();
}
MyObject item=(MyObject)item.DataItem;
中继器中继器=(发送器作为中继器);
列表项=repeater.DataSource作为列表;
Label lblGrouping=(Label)item.FindControl(“lblGrouping”);
如果(item.ItemIndex==0 | | item.DateField.Year!=items[item.ItemIndex-1].DateField.Year){
lblGrouping.Text=item.DateField.Year.ToString();
}
这对我来说很有用,因为我使用了一个表,每一行都是一个项,最左边的列包含“lblGrouping”控件。

ItemDataBound事件中的“sender”对象是repeater——使用它来访问数据源。如果数据源在绑定前已分组,则可以将当前值与以前的值进行比较,如果它们相等,则隐藏“年份”字段。像这样:

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();
}
MyObject item=(MyObject)item.DataItem;
中继器中继器=(发送器作为中继器);
列表项=repeater.DataSource作为列表;
Label lblGrouping=(Label)item.FindControl(“lblGrouping”);
如果(item.ItemIndex==0 | | item.DateField.Year!=items[item.ItemIndex-1].DateField.Year){
lblGrouping.Text=item.DateField.Year.ToString();
}
这对我来说很有用,因为我使用了一个表,每一行都是一项,最左边的列包含“lblGrouping”控件