2013-11-26 2 views
0

У меня есть дата, содержащая все мои данные, называемые dtData. В этом datatable содержатся описания задач с датой выполнения задачи для каждого описания задачи.Исключение при использовании вложенных повторителей

Вот что я хочу сделать: Пользователь выбирает месяц и год из выпадающего списка и нажимает кнопку. В зависимости от количества дней в выбранном месяце создается несколько панелей. (Если есть 30 дней, создается 30 панелей).

Каждая панель будет соответствовать одному из дней в месяце и будет отображать дату соответственно. Если дата, отображаемая на панели, соответствует дате задания для моих данных, то соответствующее описание задачи должно отображаться на панели.

Я был в состоянии вынести вид календаря, как я хочу, но по какой-то причине, пытаясь следующий код, чтобы отобразить необходимые описания задачи, NullReferenceException отбрасывается. я отлажен код и исключение на следующую строке для второго времени петли, которая содержит его запуск (Он работает прекрасно впервые):

DateTime p_time = Convert.ToDateTime(((System.Data.DataRowView)(e.Item.DataItem)).Row.ItemArray[1]); 

Вот мой полный код:

Мой ASPX:

<asp:Repeater ID="rptr_timeline" runat="server" OnItemDataBound="GetChildData"> 

    <ItemTemplate> 

     <asp:Panel ID="pnl_timeline" runat="server" BackColor="LightGray" BorderColor="Black" BorderStyle="Solid" BorderWidth="1px"> 

     &nbsp;<span id="span_day">Day</span>&nbsp;<asp:Label ID="lbl_day_number" runat="server" Text='<%# Eval("Day_Number").ToString() %>'></asp:Label>&nbsp;&nbsp; 

     <span id="span_date">Date:</span>&nbsp;<asp:Label ID="lbl_day_date" runat="server" Text='<%# Eval("Day_Date").ToString() %>'></asp:Label>&nbsp;&nbsp; 

     <asp:Label ID="lbl_day_name" runat="server" Text='<%# Eval("Day_Name").ToString() %>'></asp:Label><br /> 

     <asp:Repeater ID="rptr_tasks" runat="server"> 
      <ItemTemplate> 
       <asp:Label ID="lbl_task_name" runat="server" Text='<%# Eval("taskdescription_responsible").ToString() %>'></asp:Label> 
      </ItemTemplate> 
      <SeparatorTemplate> 
       <br /><br /> 
      </SeparatorTemplate> 
     </asp:Repeater> 

     </asp:Panel> 

    </ItemTemplate> 
    <SeparatorTemplate> 
     <br /> 
    </SeparatorTemplate> 
</asp:Repeater> 

И вот мой код позади:

protected void Load_Dateline(object sender, EventArgs e) 
{ 
    try 
    { 
     int counter = 0; 
     int months_days_number = 0; 
     int month_selected = 0; 
     int year_selected = 0; 

     month_selected = Convert.ToInt32(drpdwn_month.SelectedItem.Value); 
     year_selected = Convert.ToInt32(drpdwn_year.SelectedItem.Value); 

     months_days_number = DateTime.DaysInMonth(year_selected, month_selected); 

     DataTable dtMonthdays = new DataTable(); 
     dtMonthdays.Columns.Add("Day_Number"); 
     dtMonthdays.Columns.Add("Day_Date"); 
     dtMonthdays.Columns.Add("Day_Name"); 
     dtMonthdays.Columns.Add("ProperDate"); 

     for (counter = 1; counter <= months_days_number; counter++) 
     { 
      DataRow new_row = dtMonthdays.NewRow(); 
      if (counter < 10) 
      { 
       new_row["Day_Number"] = "0" + counter.ToString(); 
      } 
      else 
      { 
       new_row["Day_Number"] = counter.ToString(); 
      } 
      new_row["Day_Date"] = counter.ToString() + "/" + drpdwn_month.SelectedItem.Value.ToString() + "/" + year_selected.ToString(); 

      DateTime temp_date = new DateTime(year_selected, month_selected, counter); 

      new_row["Day_Name"] = temp_date.ToString("dddd"); 

      dtMonthdays.Rows.Add(new_row); 

     } 

     rptr_timeline.DataSource = dtMonthdays; 
     rptr_timeline.DataBind(); 
    } 
    catch (Exception ex) 
    { 
     lbl_error.Text = "Something went wrong!<br /><br />" + ex.ToString(); 
    } 
} 

И называется на OnItemDataBound родительского ретранслятора следующим образом:

protected void GetChildData(Object sender, RepeaterItemEventArgs e) 
{ 
    Repeater nestedRepeater = e.Item.FindControl("rptr_tasks") as Repeater; 
    DataTable dt_new = dtData.Clone(); 

    DateTime p_time = Convert.ToDateTime(((System.Data.DataRowView)(e.Item.DataItem)).Row.ItemArray[1]); 

    foreach (DataRow dr in dtData.Rows) 
    { 
     if (DateTime.Parse(dr["taskduedate_responsible"].ToString()).Equals(p_time.ToString())) 
     { 
      dt_new.ImportRow(dr); 
     } 
    } 

    if (dt_new != null && dt_new.Rows.Count != 0) 
    { 
     nestedRepeater.DataSource = dt_new; 
     nestedRepeater.DataBind(); 
    } 
} 

ответ

1

добавить проверить, находится ли данный элемент привязки элемента. или AlternateItem в вашем методе GetChildData

protected void GetChildData(Object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
    //Do binding 
    } 

} 
+0

Привет, спасибо! :-) Это отсортировало исключение ссылочной ссылки ... Но теперь это бросает другое исключение: System.FormatException: String не была признана действительной DateTime. в стилях System.DateTimeParse.Parse (String s, DateTimeFormatInfo dtfi, DateTimeStyles) в System.Convert.ToDateTime (значение String, поставщик IFormatProvider) в System.String.System.IConvertible.ToDateTime (поставщик IFormatProvider) в System.Convert.ToDateTime (Object value) и т. Д. ... –

+0

похоже, что вы создаете строку со строковым значением даты в формате dd/mm/yyyy, а затем пытаетесь ее проанализировать, но текущие настройки культуры потока .NET имеют другой формат даты. Почему вы не храните значение даты в столбце Day_Date? new_row ["Day_Date"] = новый DateTime (year_selected, Convert.ToInt32 (drpdwn_month.SelectedItem.Value), счетчик); –

+0

Как я могу ссылаться на данные родительского ретранслятора (тот, который хранится в «Day_Date» в методе GetChildData ??? –