2015-10-02 5 views
1

Прежде всего, извините за детали. но его необходимо описать мою проблему. Каждая вещь объясняет себя не так трудно читать. Благодаря!Как связать ретранслятор со списком объектов GroupBy

У меня есть список объектов из моего класса. List<CalendarEvent> allCalendarEvents = GetEvents();

public class CalendarEvent 
{ 
    public int id { get; set; } 
    public ID itemId { get; set; } 
    public DateTime start { get; set; } 
    public DateTime end { get; set; } 
    public string subject { get; set; } 
} 

Теперь я хотел, чтобы сгруппировать события в Списке allCalendarEvents по start дате. Поэтому я использовал этот код:

var monthList = from e in allCalendarEvents 
       group e by e.start.Month into g 
       orderby g.Key 
       select new { month = g.Key, Event = g }; 

Все элементы в списке теперь группируются по месяцам. Все идет нормально. Я использовал ретранслятор ASP для отображения данных пользователю.

<asp:Repeater runat="server" ID="repMonths" OnItemDataBound="repMonths_OnItemDataBound"> 
    <ItemTemplate> 
     <li> 
      <%# Eval("month") %> 

Код За

repMonths.DataSource = monthList; 
repMonths.DataBind(); 

Я могу видеть номер месяца в качестве вывода для моих данных, например для событий в мае, июне, июле, я вижу:

5 
6 
7 

Теперь я хочу, чтобы показать пользователю, сколько CalenderEvents находятся внутри одной группы месяца. Если я использую использовать другой ретранслятор внутри repMonths так:

<asp:Repeater runat="server" ID="repMonths" OnItemDataBound="repMonths_OnItemDataBound"> 
    <ItemTemplate> 
     <li> 
      <%# Eval("month") %> 
      <asp:Repeater runat="server" ID="repInnerEvent"> 
       <ItemTemplate> 
        <li> 
         <asp:Label runat="server" ID="lblEventName"></asp:Label> 
        </li> 
       </ItemTemplate> 
      </asp:Repeater> 
     </li> 
    </ItemTemplate>  
</asp:Repeater> 

Тогда я не знаю, как связать данные с внутренним ретранслятором. Например.

protected void repMonths_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    var item = e.Item.DataItem as ???; // I don't know what will come here 
} 

ответ

2

Первое, что вам нужно сделать, это найти внутренний ретранслятор. Ты на правильном пути. Используйте FindControl() на элементе ретранслятора, чтобы найти его. Затем, как только вы его получите, просто назначьте источник данных и привяжите его.

protected void repMonths_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    // We only care if the repeater item is part of the <ItemTemplate> 
    if(e.Item.ItemType == ListItemType.Item) 
    { 
     Repeater repInnerEvent = (Repeater)e.Item.FindControl("repInnerEvent"); 
     repInnerEvent.DataSource = // your data source 
     repInnerEvent.DataBind(); 
    } 
} 

Звучит как вопрос не на самом деле, как связать. Как получить данные для привязки. В этом случае у вас уже есть ваш запрос. Вам просто нужно знать месяц. В этом случае я бы использовал ярлык для хранения месяца.

<asp:Repeater runat="server" ID="repMonths" OnItemDataBound="repMonths_OnItemDataBound"> 
    <ItemTemplate> 
     <li> 
      <asp:Label ID="lblMonth" runat="server" Text='<%# Eval("month") %>'></asp:Label> 
      <asp:Repeater runat="server" ID="repInnerEvent"> 
       <ItemTemplate> 
        <li> 
         <asp:Label runat="server" ID="lblEventName"></asp:Label> 
        </li> 
       </ItemTemplate> 
      </asp:Repeater> 
     </li> 
    </ItemTemplate>  
</asp:Repeater> 

Тогда в ItemDataBound, получить эту метку и использовать ее значение.

protected void repMonths_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    // We only care if the repeater item is part of the <ItemTemplate> 
    if(e.Item.ItemType == ListItemType.Item) 
    { 
     // Get the month 
     Label lblMonth = (Label)e.Item.FindControl("lblMonth"); 

     // Get the events for the month 
     var eventList = from e in allCalendarEvents 
         where e.start.Month == lblMonth.Text 
         select e; 

     // Bind your events to the inner repeater 
     Repeater repInnerEvent = (Repeater)e.Item.FindControl("repInnerEvent"); 
     repInnerEvent.DataSource = eventList 
     repInnerEvent.DataBind(); 
    } 
} 
+0

Но все тот же вопрос ... Как я могу предоставить «DataSource»? DataSource в моем случае - это события, которые сгруппированы по месяцам. Как я могу предоставить этот один элемент группы? Спасибо .. – Kamran

+0

О, так вопрос в том, как получить данные для привязки? Не как связать. Похоже, у вас уже есть ваш запрос. Просто добавьте предложение where, где месяц является месяцем текущей строки. –

+0

Прошу прощения, можете ли вы немного объяснить в ответе. Спасибо .. – Kamran

Смежные вопросы