我需要创建一个嵌套的listview并找到关于如何做的a great article,但我的情况有点不同。我是一个linq新手,需要一点帮助,请:)
我需要将我的数据转换为与该文章类似的格式(在上面的链接上,搜索“配置ListView”并查看其上方的表格)。
这是我的数据:
Format Movie Name Price
DVD Star Wars 12.99
DVD Star Wars II 13.99
Blue-Ray Star Wars 15.99
Blue-Ray Star Wars II 17.99
这就是我所拥有的,这不是那么接近,但它是我能得到的:
var MoviesToBuy = from Movie in dtMovieListDetails.AsEnumerable()
//join MovieDetails in dtMovieListDetails.AsEnumerable() on (string)Movie["ID"] equals (string)MovieDetails["ID"]
group Movie by new
{
Format = Movie["Format"],
Movies = Movie
} into grp
select new
{
Format = (string)grp.Key.Format,
Movies = grp.Key.Movies
};
MoviesToBuy = MoviesToBuy.OrderBy(p => p.Format);
lvwAmazonMovieGroup.DataSource = MoviesToBuy.ToList();
lvwAmazonMovieGroup.DataBind();
我有3个具体问题:
1。)我所做的不起作用。由于组中的第二列等于所有行,因此不会创建实际组。
2.。)尽管先前的问题,我也得到“数据源是一个无效的类型。它必须是IListSource,IEnumerable或IDataSource”错误。在这种情况下,Movies列正在创建为DataRow数据类型。不确定这是否是造成问题的原因。我可以以某种方式投射该场地吗?
3.。)如何对电影中的字段进行排序。即最后我希望数据按格式然后按电影名称排序,因此嵌套列表视图如下所示:
Blue-Ray
Star Wars 12.99
Star Wars II 13.99
DVD
Star Wars 15.99
Star Wars II 17.99
非常感谢任何一点!
提前致谢, 乍得
答案 0 :(得分:1)
我想你可以从以下开始,调整适当的变量名和AsEnumerable()等。
您可以根据需要订购电影,并按照您的要求将它们置于嵌套结构中:
var moviesToBuy = from movie in dtMovieListDetails
orderby movie.Format, movie.Price
group movie by movie.Format into grp
select new
{
Format = grp.Key,
Movies = grp.Select (g => new { MovieName = g.MovieName, Price = g.Price })
};
答案 1 :(得分:0)
尝试这样的事情:
var res = from m in movies
group m by m.Format into grouped
orderby grouped.Key
select new
{
Format = grouped.Key,
Movies = grouped.AsEnumerable().OrderBy(x => x.MovieName)
};
可选地
var res = from m in movies
orderby m.MovieName
group m by m.Format into grouped
orderby grouped.Key
select new
{
Format = grouped.Key,
Movies = grouped.AsEnumerable()
};
使用此种子数据:
var movies = new[] {
new Movie { Format = "DVD", MovieName = "SW1"},
new Movie { Format = "Blue-ray", MovieName = "SW1"},
new Movie { Format = "DVD", MovieName = "SW2"},
new Movie { Format = "Blue-ray", MovieName = "SW2"},
new Movie { Format = "DVD", MovieName = "RF"}
};
制作人:
Format: Blue-ray
Movie: SW1
Movie: SW2
Format: DVD
Movie: RF
Movie: SW1
Movie: SW2
为了完整性,我使用此代码生成上一个列表
foreach (var item in res)
{
Console.WriteLine("Format: " + item.Format);
foreach (var item2 in item.Movies)
{
Console.WriteLine("\tMovie: " + item2.MovieName);
}
}