2014-11-05 50 views
0

我有一個日曆,你可以把一些約會的議程,但不允許第一次約會第二次約會。所以不允許他們相互交叉。我嘗試這樣的:比較兩個日期,不允許重疊的第一個議程事件

public bool IsOverlapping(AgendaEventViewModel viewModel, AgendaEventViewModel newItem) 
     { 
      bool isOverlapping = false; 
      DateTime? begin = DateTime.Parse(viewModel.start); 
      DateTime? end = DateTime.Parse(viewModel.end); 

      newItem = new AgendaEventViewModel(); 
      DateTime begin2 = DateTime.Parse(newItem.start); 
      DateTime end2 = DateTime.Parse(newItem.end); 

      // TODO: Check if Event is Overlapping with other events :) Dynamic RoomRules Check should implemented here 
      if (begin > end || begin2 > end2) 
       isOverlapping = false; 

      if (begin == end || begin2 == end2) 
       isOverlapping = false; // No actual date range 

      if (begin > end || begin2 > end2) 
      { 
       isOverlapping = false; 
      } 

      if (begin == begin2 && end == end2) 
      { 
       isOverlapping = true; 
       this.ShowMessage(Message.Type.Info, Resources.AgendaEvent.IsOverlapping); 
      } 

      if (begin < begin2) 
      { 
       if (end > begin2 && end < end2) 
        isOverlapping = true; // possible1 

       if (end > end2) 
        isOverlapping = true; // possible 3 
      } 
      else 
      { 
       if (end2 > begin && end2 < end) 
        isOverlapping = true; // possible 2 

       if (end2 > end) 
        isOverlapping = true; // possible 4 
      }   
      return isOverlapping; 
} 

,這是AgendaEventViewModel:

public class AgendaEventViewModel 
    { 
     public string ReturnUrl { get; set; } 

     public string id { get; set; } 
     public int? funeralId { get; set; } 
     public int? reservationId { get; set; } 

     public int? roomId { get; set; } 

     [Display(Name = "Title", ResourceType = typeof(Resources.AgendaEvent))] 
     public string title { get; set; } 

     [Display(Name = "Start", ResourceType = typeof(Resources.AgendaEvent))] 
     public string start { get; set; } 

     [Display(Name = "End", ResourceType = typeof(Resources.AgendaEvent))] 
     public string end { get; set; } 

     public string top { get; set; } 
     public string left { get; set; } 

     public List<RoomItemModel> RoomItems { get; set; } 
     public List<CateringItemModel> CateringItems { get; set; } 

     [Display(Name = "SeatingCapacity", ResourceType = typeof(Resources.AgendaEvent))] 
     public int? SeatingCapacity { get; set; } //Max Room SeatingCapacity 

     [Display(Name = "ExpectedSeatingCapacity", ResourceType = typeof(Resources.AgendaEvent))] 
     public int? ExpectedSeatingCapacity { get; set; } // User Chosen 
    } 

,但我得到這一行此錯誤:

日期時間begin2 = DateTime.Parse(newItem.start) ;與此錯誤:

類型「System.ArgumentNullException」的一個例外發生在mscorlib.dll但在用戶代碼中沒有處理

其他信息:String引用不設置爲一個字符串的一個實例。

謝謝

好吧,我現在,像這樣:

public bool IsOverlapping(AgendaEventViewModel viewModel, AgendaEventViewModel newItem) 
     { 
      bool isOverlapping = false; 
      // ReservationModel r = new ReservationModel(int.Parse(viewModel.id)); 
      DateTime? begin = DateTime.Parse(viewModel.start); 
      DateTime? end = DateTime.Parse(viewModel.end); 


      newItem = new AgendaEventViewModel(); 
      newItem.start = "2014-08-11 10:00:00.000"; 
      newItem.end = "2014-08-11 11:00:00.000"; 
      DateTime? begin2 = DateTime.Parse(newItem.start); 
      DateTime? end2 = DateTime.Parse(newItem.end); 

      // TODO: Check if Event is Overlapping with other events :) Dynamic RoomRules Check should implemented here 
      if (begin > end || begin2 > end2) 
       isOverlapping = false; 

      if (begin == end || begin2 == end2) 
       isOverlapping = false; // No actual date range 



      if (begin > end || begin2 > end2) 
      { 
       isOverlapping = false; 
      } 


      //if ((begin <= end2) && (begin2 <= end)) 
      //{ 
      // this.ShowMessage(Message.Type.Info, Resources.AgendaEvent.IsOverlapping); 
      // isOverlapping = true; 
      //} 

      if (begin == begin2 && end == end2) 
      { 
       this.ShowMessage(Message.Type.Info, Resources.AgendaEvent.IsOverlapping); 
       isOverlapping = true; 
      } 

      if (begin < begin2) 
      { 
       if (end > begin2 && end < end2) 
        isOverlapping = true; // possible1 

       if (end > end2) 
        isOverlapping = true; // possible 3 
      } 
      else 
      { 
       if (end2 > begin && end2 < end) 
        isOverlapping = true; // possible 2 

       if (end2 > end) 
        isOverlapping = true; // possible 4 
      } 




      return isOverlapping; 
     } 

但是如果我把第二個議題上的日曆,然後開始帶結束將通過END2和begin2覆蓋。

+1

對於只有一個參數的函數,您將得到一個ArgumentNullException。我認爲這是一個很好的指示,newItem.start爲空。看看你的代碼 - 你用newItem = new AgendaEventViewModel();來清除傳入的newItem。 – 2014-11-05 16:08:45

回答

0

newItem.startnull,所以當你嘗試分析它,它拋出一個System.ArgumentNullException。確保在嘗試解析它之前設置新項目的日期。

+0

謝謝,但如何做到這一點? – savantKing 2014-11-05 16:42:00

0

您的問題的答案是使用TryParse方法。 Thet會告訴你它是否不能將字符串解析成DateTime。

 DateTime begin2; 
     if (!DateTime.TryParse(newItem.start, out begin2)) 
     { 
      // handle error. 
     } 

但您還有其他需要解決的問題。

您正在設置isOverlapping,然後您繼續進行測試,以便通過稍後的邏輯重置。實際返回值將是最後一次測試的值。

爲什麼開始結束可空DateTime是否但是begin2END2定期DateTime是否?

這個邏輯的一部分是測試重疊,但其他邏輯正在驗證開始和結束值是合法值。也許驗證邏輯應該被分解成一個單獨的過程,所以你知道有錯誤。您正在進行驗證,但將其報告爲非重疊結果。

+0

嗨Gridly,謝謝你的answare,我已經編輯我的帖子 – savantKing 2014-11-06 10:39:57