2016-04-11 9 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); 
       } 
      } 
     } 

リストは0,1を示しOBVので、私はそれ爆弾アウト-1 [配列int型]でを持っていない場合は私の問題は、ここでは

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

このコードにありループpr oballyは2つの項目を示します。どのようなオブジェクトが範囲外のインデックスエラーを回避する最善の方法です。

Getholidaysは、stafメンバーが私たちのためにシンプルなリストになっていますので、ここで気にすることはありません。

public List<tblApertureNetShiftPattern> getHolidays() 
{ 
     List<tblApertureNetShiftPattern> list = new List<tblApertureNetShiftPattern>(); 

     var q = from _holidays in apertureNetEntities.tblApertureNetShiftPatterns.Where(w => w.isDeleted == false) 
       select _holidays; 

     list = q.ToList(); 

     return list; 
} 

また、自分のコードが非常に肥大していると感じるように、よりうまくやっています。

+0

また、if/elseifの全体を辞書に移動してから直接アクセスすることもできます。これには重複したコードが含まれています –

答えて

0

本当に問題が発生する行はありますか? _listに少なくとも1つの要素が含まれている場合にのみ、foreachループの本文を入力できるためです。したがって、_list.Count >= 1は常に真となり、iは増分され、決して-1になりません。

私はこのコード行

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

は、このリストには少なくとも6つの項目が常にありますが、よろしいですから発信バウンド例外のあなたのアウトが疑われますか?

一般に、foreachループで反復処理すると、インデックスでリストアイテムにアクセスするのはなぜですか?あなたはmanager_nameプロパティでそれを行うだけのよう

foreach (tblApertureNetShiftPattern sp in _list) { 

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

を次のようにあなたはそれを容易に行うことができます。

インデックスによるアクセスを主張する場合は、ループの最後にインデックス変数iを増やすことをお勧めします。この方法では、配列にアクセスする前に必ずインデックスを減らす必要はありません。

+0

はい、当時は常にプログラムの中に6人のマネージャーです – rogue39nin

+0

これは本当ですが、あなたの投稿されたコードでは、範囲外の例外が存在することはありません。 – derpirscher

+0

さて、OPは "私は[配列int]で-1を持っていない..."と述べた。明らかに '-1'を削除すると、範囲外になります。本当の質問は、なぜ、私は最初に「++」があるのでしょうか? –

関連する問題