3

ネストされたリストビューを作成する必要があり、その方法に関する素晴らしい記事を見つけましたが、私の状況は少し異なります。私は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 番目の列はすべての行に相当するため、実際のグループは作成されません。

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

どんな点でも大歓迎です!

前もってありがとう、チャド

4

2 に答える 2

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

上記のクエリを実装するサンプル プログラムを次に示します。

于 2012-06-05T23:53:06.677 に答える
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);
    }
}
于 2012-06-05T23:33:18.910 に答える