Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较两个日期,不允许与第一个议程事件重叠_C#_Asp.net Mvc 4 - Fatal编程技术网

C# 比较两个日期,不允许与第一个议程事件重叠

C# 比较两个日期,不允许与第一个议程事件重叠,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我有日历,你可以在日程上安排一些约会,但第一次约会不允许有第二次约会。因此,不允许它们相互交叉。我试着这样做: public bool IsOverlapping(AgendaEventViewModel viewModel, AgendaEventViewModel newItem) { bool isOverlapping = false; DateTime? begin = DateTime.Parse(viewModel.s

我有日历,你可以在日程上安排一些约会,但第一次约会不允许有第二次约会。因此,不允许它们相互交叉。我试着这样做:

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;
}
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;
        }
这是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
    }
但我在这一行中发现了这个错误:

DateTime begin2=DateTime.ParsenewItem.start;出现此错误时:

mscorlib.dll中发生“System.ArgumentNullException”类型的异常,但未在用户代码中处理

其他信息:字符串引用未设置为字符串的实例

多谢各位

好的,我现在有了,像这样:

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;
}
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;
        }

但是,如果我在日历上放置第二个议程项目,则begin en end将通过end2和begin2覆盖。

您的newItem.start为null,因此当您尝试解析它时,它会抛出System.ArgumentNullException。在尝试解析新项目之前,请确保设置了该项目的日期。

问题的答案是使用TryParse方法。Thet将告诉您是否无法将字符串解析为DateTime

        DateTime begin2;
        if (!DateTime.TryParse(newItem.start, out begin2))
        {
            // handle error.
        }
但你还有其他问题需要解决

您正在设置isOverlapping,然后继续进行测试,以便通过稍后的逻辑重置它。实际返回值将是上次测试的值

为什么begin和end可以为空日期时间,而begin2和end2是常规日期时间


其中一些逻辑正在测试重叠,但其他逻辑正在验证开始值和结束值是否为合法值。也许验证逻辑应该分为一个单独的过程,以便您知道存在错误。您正在进行验证,但将其报告为非重叠结果。

您在只接受一个参数的函数上得到ArgumentNullException。我认为这很好地表明newItem.start为null。查看您的代码-您正在清除newItem=new AgendaEventViewModel;传递的newItem;。谢谢,但是怎么做呢?