我想在转发器中按年分组新闻报道。格式为:
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);
有什么想法吗?
提前致谢!
答案 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;
或者,您可以首先避免使用匿名类型 - 使用GroupedNewsList
和Year
属性创建自己的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”控件。