protected void clDatesTo_SelectedDateChanged(object sender, SelectedDateChangedEventArgs e) { if (!e.NewDate.HasValue) { SelectedArrivalDateTo = e.OldDate ?? SelectedArrivalDateFrom ?? FirstArrivalDate; clDatesTo.Focus(); return; } if (!ArrivalDates.Any(p => p.Date == e.NewDate)) { SelectedArrivalDateTo = e.OldDate; clDatesTo.Focus(); QDSearch.Helpers.Web.ShowMessage(sender as Control, "В эту дату нету вылетов выберете другую дату"); return; } if (!SelectedArrivalDateFrom.HasValue || e.NewDate.Value < SelectedArrivalDateFrom.Value) { SelectedArrivalDateFrom = e.NewDate; } if ((e.NewDate.Value - SelectedArrivalDateFrom.Value).Days > MaxArrivalRange) { SelectedArrivalDateFrom = ArrivalDates.Cast <DateTime?>().OrderBy(d => d).FirstOrDefault(d => d >= e.NewDate.Value.AddDays(-MaxArrivalRange) && d <= e.NewDate); QDSearch.Helpers.Web.ShowMessage(sender as Control, String.Format(@"Выбран период заездов больше {0}. Дата ""C"" изменена на {1:dd.MM.yyyy}", MaxArrivalRange, SelectedArrivalDateFrom)); } IsArrivalDateChangedByUser = true; OnSelectedArrivalRangeChanged(new EventArgs()); }
/// <summary> /// Задает период дат заездов из загруженных в календарь дат заездов. /// Если дата dateFrom отстуствует среди загруженных дат заездов в каледарь, то выбирается ближайшая большая. /// Если дата dateTo отстуствует среди загруженных дат заездов в каледарь, то выбирается ближайшая меньшая. /// Если разница между датами С и ПО больше MaxArrivalRange, то в этом случае дата ПО автоматически обрезатеся до дата С плюс MaxArrivalRange. /// Если в заданном диапозоне нет дат заездов, то происходит сброс ранее выбранных дат и новые даты заездов не выбираеются. /// </summary> /// <param name="dateFrom">Дата начала выбираемого диапозона дат заездов включительно.</param> /// <param name="dateTo">Дата конца выбираемого диапозона дат заездов включительно.</param> /// <returns>true - даты заездов подобраны успешно, false - в указанном диапозен нет дат заездов</returns> public bool SelectArrivalRange(DateTime dateFrom, DateTime dateTo) { if (dateFrom < DateTime.Today) { throw new ArgumentOutOfRangeException("dateFrom", dateFrom, "Дата ОТ не может быть меньше текущей даты"); } if (dateTo < DateTime.Today) { throw new ArgumentOutOfRangeException("dateTo", dateTo, "Дата ДО не может быть меньше текущей даты"); } if (dateFrom > dateTo) { throw new ArgumentOutOfRangeException("dateFrom", dateFrom, "Дата ОТ не может быть больше даты ДО."); } if ((dateTo - dateFrom).Days > MaxArrivalRange) { dateTo = dateFrom.AddDays(MaxArrivalRange); } if (ArrivalDates == null || !ArrivalDates.Any()) { ClearSelectedArrivalRange(); return(false); } var selectedDateFrom = ArrivalDates.Cast <DateTime?>().OrderBy(d => d).FirstOrDefault(d => d >= dateFrom.Date); if (!selectedDateFrom.HasValue) { ClearSelectedArrivalRange(); return(false); } var selectedDateTo = ArrivalDates.Cast <DateTime?>().OrderBy(d => d).LastOrDefault(d => d <= dateTo.Date && d >= selectedDateFrom); if (!selectedDateTo.HasValue) { ClearSelectedArrivalRange(); return(false); } clDatesFrom.SelectedDate = selectedDateFrom; clDatesTo.SelectedDate = selectedDateTo; return(true); }