2014-11-05 69 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