1

我想在转发器中按年对新闻文章进行分组。格式为:

2010

文章列表

2011

文章列表

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

        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);

有任何想法吗?

提前致谢!

4

2 回答 2

3

你没有- 你只有一个grouping。如果你想要一个,你需要改变你的查询,例如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使用YearEvents属性创建您自己的类型,在您的查询中填充它,然后在您的事件处理程序中转换为它。

于 2012-03-14T23:28:39.787 回答
1

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

于 2013-09-08T00:57:58.670 回答