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

あなたは持っていませんList<News>- あなたはgroupingを持っているだけです。が必要な場合List<News>は、クエリを変更する必要があります。

var groupedNewsList = from e in events
                      group e by e.StoryDate.Year into g
                      select new { Year = g.Key, Events = g.ToList() };

dynamicC# 4 を使用している場合は、入力を使用してリフレクションをより簡単に実行できることに注意してください。

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

各行が 1 つの項目であるテーブルを使用し、一番左の列に「lblGrouping」コントロールが含まれていたため、これはうまくいきました。

于 2013-09-08T00:57:58.670 に答える