2016-04-11 2 views
-1

Следующий код работает, чтобы показать людям, у которых есть праздники с иконкой в ​​моем календаре, но проблема у меня есть первая строка кода в моей инструкции for, где я извлекаю датуОбъект за пределами установленного списка

protected void apertureAppointments_TimeSlotCreated(object sender, TimeSlotCreatedEventArgs e) 

     int i = 0; 
     bool isFound = false; 
     List<tblApertureNetShiftPattern> _list = new List<tblApertureNetShiftPattern>(); 
     _list = _dal.getHolidays(); 
     List<Resource> resources = new List<Resource>(apertureAppointments.Resources.GetResourcesByType("Managers")); 
     Resource res = resources[5]; 

     foreach (tblApertureNetShiftPattern sp in _list) 
     { 
      if (_list.Count >= 1) 
       i++; 
      else 
       i = 0; 

      DateTime? dt1 = _list[i - 1].startdate; 
      DateTime? dt2 = _list[i - 1].endDate; 
      if (e.TimeSlot.Start == dt1 && e.TimeSlot.Resource.Text == sp.manager_name) 
      { 
       isFound = true; 
       if (DoDateRangesOverlap(e.TimeSlot.Start, e.TimeSlot.End, dt1, dt2) && isFound == true) 
       { 
        Label temperatureLabel = new Label(); 

        if (sp.appointmentType == Constants.shiftDayoff) 
        { 
         e.TimeSlot.CssClass = "DayOfCssStyle"; 

         temperatureLabel.CssClass = "DayOfCssStyle"; 
        } 
        else if (sp.appointmentType == Constants.shiftHoliday) 
        { 
         e.TimeSlot.CssClass = "HolidayCssStyle"; 
         temperatureLabel.CssClass = "HolidayCssStyle"; 
        } 
        else if (sp.appointmentType == Constants.shiftStat) 
        { 
         e.TimeSlot.CssClass = "statCssStyle"; 
         temperatureLabel.CssClass = "statCssStyle"; 
        } 
        else if (sp.appointmentType == Constants.shiftsickDay) 
        { 
         e.TimeSlot.CssClass = "SickDayStyle"; 
         temperatureLabel.CssClass = "SickDayStyle"; 
        } 
        temperatureLabel.Text = sp.Description; 

        Image imageControl = new Image(); 

        imageControl.ImageUrl = @"~\images\aperturenet\Calendar\resources\holidays.png"; 

        temperatureLabel.BackColor = System.Drawing.Color.Orange; 

        dt1 = null; 
        dt2 = null; 
        isFound = false; 
        e.TimeSlot.Control.Controls.AddAt(1, temperatureLabel); 
        e.TimeSlot.Control.Controls.AddAt(2, imageControl); 
       } 
      } 
     } 

Моя проблема заключается в этом коде здесь

if (_list.Count >= 1) 
       i++; 
      else 
       i = 0; 
      DateTime? dt1 = _list[i - 1].startdate; 
      DateTime? dt2 = _list[i - 1].endDate; 

Когда у меня нет -1 в [массив междунар] это бомбы, потому что OBV список показывает 0,1 и петля pr obally показывает 2 предмета. Каков наилучший способ избежать ошибки индекса вне диапазона?

Getholidays - это простой список того, когда наш член должен быть таким, чтобы ничто не представляло здесь.

Также их более простой способ сделать так, чтобы я чувствовал, что мой код очень раздутый.

+0

Я бы также переместил всю вещь if/elseif в словарь, а затем сразу же получил доступ к ней. Он содержит повторяющийся код –

ответ

0

Вы уверены, что это линии, вызывающие проблемы? Поскольку вы можете ввести тело цикла foreach, если _list содержит хотя бы один элемент. Таким образом, _list.Count >= 1 всегда будет true, и i будет увеличиваться и никогда не становиться -1.

Я подозреваю, что ваш из связанного исключения, происходящих из этой строки кода

List<Resource> resources = new List<Resource>(apertureAppointments.Resources.GetResourcesByType("Managers")); 
Resource res = resources[5]; 

Вы уверены, что всегда есть по крайней мере 6 пунктов в этом списке?

Как правило, почему вы получаете доступ к своим спискам по индексу, если вы перебираете их с помощью цикла foreach? Вы можете легко сделать это следующим образом

foreach (tblApertureNetShiftPattern sp in _list) { 

    DateTime? dt1 = sp.startDate; 
    DateTime? dt2 = sp.endDate; 
} 

так же, как вы это делаете с manager_name собственности.

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

+0

Да, они всегда 6 менеджеров на данный момент программы – rogue39nin

+0

Если это так, то с вашим опубликованным кодом нет способа, чтобы исключение из-за пределов. – derpirscher

+0

Ну, ОП сказал: «Когда у меня нет -1 в [array int] ...». Очевидно, что удаление «-1» приведет к выходу за пределы. Поэтому истинный вопрос заключается в том, почему «i ++» в первую очередь? –

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

  • Нет связанных вопросов^_^