Linq 在Repeater ItemDataBound中获取I分组数据
我想把每年的新闻文章放在一个转发器里。格式为: 2010年 物品清单 2011年 物品清单 我的访问层返回一个新闻文章的平面列表,特别是列表。因此,我将它们分组并绑定到中继器,如下所示: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
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”控件