To reproduce: RadScheduler radScheduler1 = new RadScheduler(); public Form1() { InitializeComponent(); this.Controls.Add(this.radScheduler1); this.radScheduler1.Dock = DockStyle.Fill; Timer timer = new Timer(); timer.Interval = 1000; timer.Tick += timer_Tick; this.radScheduler1.ActiveViewType = SchedulerViewType.Timeline; SetupView(DateTime.Now.Date); timer.Start(); } private void SetupView(DateTime currentDateTime) { SchedulerTimelineView timelineView = radScheduler1.GetTimelineView(); timelineView.RangeStartDate = currentDateTime; timelineView.RangeEndDate = currentDateTime.AddHours(23).AddMinutes(59).AddSeconds(59); timelineView.StartDate = currentDateTime; radScheduler1.FocusedDate = currentDateTime; var scale = Timescales.Hours; timelineView.ShowTimescale(scale); var currentScaling = timelineView.GetScaling(); currentScaling.DisplayedCellsCount = 24; this.radScheduler1.SchedulerElement.RefreshViewElement(); } int count = 1; private void timer_Tick(object sender, EventArgs e) { SetupView(DateTime.Now.AddDays(++count)); } Workaround: SchedulerTimelineView .ShowNavigationElement = false;
To reproduce: public RadRibbonForm1() { InitializeComponent(); this.radScheduler1.FocusedDate = new DateTime(2016, 1, 1); this.radScheduler1.ActiveViewType = Telerik.WinControls.UI.SchedulerViewType.Timeline; SchedulerTimelineView timelineView = this.radScheduler1.GetTimelineView(); timelineView.RangeStartDate = new DateTime(2016, 1, 1, 00, 00, 00); timelineView.RangeEndDate = new DateTime(2016, 12, 31, 23, 59, 59); timelineView.StartDate = new DateTime(2016, 1, 1, 00, 00, 00); Appointment appointment = new Appointment(new DateTime(2016, 1, 1, 00, 00, 00), new DateTime(2016, 1, 10, 00, 00, 00), "Quarter 1"); Appointment appointment2 = new Appointment(new DateTime(2016, 2, 1, 00, 00, 00), new DateTime(2016, 2, 10, 00, 00, 00), "Quarter 1"); Appointment appointment3 = new Appointment(new DateTime(2016, 4, 1, 00, 00, 00), new DateTime(2016, 4, 10, 00, 00, 00), "Quarter 2"); Appointment appointment4 = new Appointment(new DateTime(2016, 5, 1, 00, 00, 00), new DateTime(2016, 6, 10, 00, 00, 00), "Quarter 2"); Appointment appointment5 = new Appointment(new DateTime(2016, 7, 1, 00, 00, 00), new DateTime(2016, 7, 10, 00, 00, 00), "Quarter 3"); Appointment appointment6 = new Appointment(new DateTime(2016, 8, 1, 00, 00, 00), new DateTime(2016, 8, 10, 00, 00, 00), "Quarter 3"); Appointment appointment7 = new Appointment(new DateTime(2016, 11, 1, 00, 00, 00), new DateTime(2016, 11, 10, 00, 00, 00), "Quarter 4"); Appointment appointment8 = new Appointment(new DateTime(2016, 12, 1, 00, 00, 00), new DateTime(2016, 12, 10, 00, 00, 00), "Quarter 4"); this.radScheduler1.Appointments.Add(appointment); this.radScheduler1.Appointments.Add(appointment2); this.radScheduler1.Appointments.Add(appointment3); this.radScheduler1.Appointments.Add(appointment4); this.radScheduler1.Appointments.Add(appointment5); this.radScheduler1.Appointments.Add(appointment6); this.radScheduler1.Appointments.Add(appointment7); this.radScheduler1.Appointments.Add(appointment8); QuarterTimescale qTimeScale = new QuarterTimescale(); qTimeScale.DisplayedCellsCount = 4; timelineView.SchedulerTimescales.Add(qTimeScale); this.radScheduler1.GetTimelineView().ShowTimescale(qTimeScale); } class QuarterTimescale : MonthTimescale { public override int ScalingFactor { get { return 3; } } public override string Name { get { return "Quarter"; } } }
To reproduce: DateTime dtStart = DateTime.Today.AddDays(2).AddHours(10); DateTime dtEnd = DateTime.Today.AddDays(2).AddHours(12); Appointment appointment = new Appointment(dtStart, dtEnd, "TEST", "Description"); this.radScheduler1.Appointments.Add(appointment); System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("ar-SA"); Try to open the edit dialog. Workaround: create a custom dialog that inherits RadSchedulerDialog and implements IEditAppointmentDialog. Thus, you will be able to handle the whole edit operation. public class Scheduler : RadScheduler { protected override IEditAppointmentDialog CreateAppointmentEditDialog() { return new MyDialog(); } public override string ThemeClassName { get { return typeof(RadScheduler).FullName; } } } public partial class MyDialog : RadSchedulerDialog, IEditAppointmentDialog { public MyDialog() { InitializeComponent(); } Appointment appointment; protected override void OnLoad(EventArgs e) { base.OnLoad(e); //an example how specify the start date RadDateTimePicker dtStart = this.Controls[0] as RadDateTimePicker; dtStart.Value = this.appointment.Start; } public void ShowRecurrenceDialog() { //ToDo } public bool EditAppointment(Telerik.WinControls.UI.IEvent appointment, Telerik.WinControls.UI.ISchedulerData schedulerData) { this.appointment = appointment as Appointment; return true; } }
To reproduce: Open Demo application >> Scheduler >> Printing example. Add two appointments one of which is with duration 1 hour, the other one lasts 2 hours. When you click the PrintPreview button, the shorter appointment is missing. Workaround: public Form1() { InitializeComponent(); this.radScheduler1.PrintStyle = new CustomSchedulerDailyPrintStyle(); } public class CustomSchedulerDailyPrintStyle :SchedulerDailyPrintStyle { protected override void DrawAppointments(DateTime currentDate, IResource resource, Rectangle appArea, Graphics graphics) { int rowCount = Math.Max(1, (int)Math.Ceiling((TimeEndRange - TimeSpan.FromHours(TimeStartRange.Hours)).TotalHours)); float rowHeight = (float)appArea.Height / rowCount; List<IEvent> appointments = this.GetAppointments(currentDate, false, resource); appointments.Sort(CompareAppointments); bool setColumn = true; Dictionary<IEvent, int> columns = new Dictionary<IEvent, int>(); Dictionary<IEvent, int> maxColumns = new Dictionary<IEvent, int>(); int currentColumn = 0; while (setColumn) { setColumn = false; DateTime currentTime = DateTime.MinValue; foreach (IEvent app in appointments) { if (!columns.ContainsKey(app) && DateFloor(app.Start) >= currentTime) { setColumn = true; columns.Add(app, currentColumn); currentTime = DateCeiling(app.End); } } currentColumn++; } DateTime maxEndDate = DateTime.MinValue; int lastIndex = 0; int maxColumn = 0; for (int i = 0; i <= appointments.Count; i++) { if (i == appointments.Count || DateFloor(appointments[i].Start) >= maxEndDate) { for (int j = lastIndex; j < i; j++) { maxColumns.Add(appointments[j], maxColumn); } maxColumn = 0; lastIndex = i; } if (i == appointments.Count) { break; } maxColumn = Math.Max(maxColumn, columns[appointments[i]]); if (maxEndDate < DateCeiling(appointments[i].End)) { maxEndDate = DateCeiling(appointments[i].End); } } foreach (IEvent app in appointments) { AppointmentPrintElement printedAppointment = new AppointmentPrintElement(app, this.Scheduler); printedAppointment.ShowHours = false; printedAppointment.DrawBorder = printedAppointment.DrawFill = true; float appY = appArea.Y + Math.Max(0, (float)(((DateFloor(printedAppointment.Start) - currentDate.Add(this.TimeStartRange)).TotalHours) * rowHeight)); float appBottom = appArea.Y + Math.Min(appArea.Height, (float)(((DateCeiling(printedAppointment.End) - currentDate.Add(this.TimeStartRange)).TotalHours) * rowHeight)); float appHeight = appBottom - appY - app.End.Minute; float appWidth = (appArea.Width - HoursColumnWidth) / (maxColumns[app] + 1); float appX = appArea.X + HoursColumnWidth + columns[app] * appWidth; RectangleF appRect = new RectangleF(appX, appY, appWidth, appHeight); appRect.Inflate(-2f, -2f); this.DrawAppointment(printedAppointment, graphics, appRect); } } }
To reproduce: follow the steps from the attached gif file. Workaround: public Form1() { InitializeComponent(); this.radScheduler1.RecurrenceEditDialogShowing += radScheduler1_RecurrenceEditDialogShowing; } CustomEditRecurrenceDialog dialog = null; private void radScheduler1_RecurrenceEditDialogShowing(object sender, Telerik.WinControls.UI.RecurrenceEditDialogShowingEventArgs e) { if (dialog == null) { dialog = new CustomEditRecurrenceDialog(e.Appointment); } e.RecurrenceEditDialog = dialog; } public class CustomEditRecurrenceDialog : EditRecurrenceDialog { public CustomEditRecurrenceDialog(IEvent appointment) : base(appointment) { } protected override void ApplyAppointmentDates() { DateTime end = this.appointment.End; base.ApplyAppointmentDates(); this.appointment.End = new DateTime(end.Year, end.Month, end.Day, this.timeEnd.Value.Hour, this.timeEnd.Value.Minute, this.timeEnd.Value.Second); } }
Please refer to the attached gif file illustrating how to reproduce the problem with the Demo application. When you define a new appointment with 24 months interval, it is expected to have this event every 2 years, not each year. To reproduce: you can use the following code snippet as well: MonthlyRecurrenceRule monthlyRecurrenceRule = new MonthlyRecurrenceRule(DateTime.Now, WeekDays.Monday, 2, 24); Appointment a = new Appointment(DateTime.Now, TimeSpan.FromHours(3), "Test"); a.RecurrenceRule = monthlyRecurrenceRule; this.radScheduler1.Appointments.Add(a); Workaround: public Form1() { InitializeComponent(); this.radScheduler1.AppointmentAdded += radScheduler1_AppointmentAdded; } private void radScheduler1_AppointmentAdded(object sender, AppointmentAddedEventArgs e) { MonthlyRecurrenceRule montlyRule = e.Appointment.RecurrenceRule as MonthlyRecurrenceRule; if (montlyRule != null) { CustomMonthlyRecurrenceRule rrule = new CustomMonthlyRecurrenceRule(); rrule.Start = montlyRule.Start; rrule.End = montlyRule.End; rrule.Interval = montlyRule.Interval; rrule.Offset = montlyRule.Offset; rrule.WeekDays = montlyRule.WeekDays; rrule.WeekNumber = montlyRule.WeekNumber; rrule.FirstDayOfWeek = montlyRule.FirstDayOfWeek; rrule.Count = montlyRule.Count; e.Appointment.RecurrenceRule = rrule; } } public class CustomMonthlyRecurrenceRule : MonthlyRecurrenceRule { public override bool MatchAdvancedPattern(DateTime date, DateTimeFormatInfo dateTimeFormat) { int monthIndex = this.Start.Value.Month - date.Month; DateTime calculatedNextDate = this.Start.Value.AddMonths(this.Interval); monthIndex = calculatedNextDate.Month - date.Month; if (calculatedNextDate.Year > date.Year) { return false; } if ((monthIndex % this.Interval) != 0) { return false; } if (0 != this.WeekNumber && !this.MatchWeekOfMonth(date, dateTimeFormat)) { return false; } if (0 != this.DayNumber && !this.MatchDayOfMonth(date, dateTimeFormat)) { return false; } if (this.WeekDays != WeekDays.None && !this.MatchDayOfWeekMask(date, dateTimeFormat.Calendar)) { return false; } if (this.Offset != 0 && !this.MatchOffset(date, dateTimeFormat)) { return false; } return true; } }
Please refer to the attached gif file.
public Form1() { InitializeComponent(); DateTime d = DateTime.Now.Date; radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 1, 30, 0), new DateTime(d.Year, d.Month, d.Day, 1, 30, 0), "Appointment_Free_0", "", "")); radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 8, 30, 0), new DateTime(d.Year, d.Month, d.Day, 9, 0, 0), "Appointment_Free_0", "", "")); radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 11, 00, 0), new DateTime(d.Year, d.Month, d.Day, 11, 30, 0), "Appointment_Free_0", "", "")); radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 11, 0, 0), new DateTime(d.Year, d.Month, d.Day, 11, 0, 0), "Appointment_Free_0", "", "")); radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 10, 30, 0), new DateTime(d.Year, d.Month, d.Day, 11, 0, 0), "Appointment_Free_0", "", "")); radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 11, 00, 0), new DateTime(d.Year, d.Month, d.Day, 11, 30, 0), "Appointment_Free_0", "", "")); radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 11, 30, 0), new DateTime(d.Year, d.Month, d.Day, 12, 0, 0), "Appointment_Free_0", "", "")); radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 14, 0, 0), new DateTime(d.Year, d.Month, d.Day, 14, 30, 0), "Appointment_Free_0", "", "")); radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 15, 00, 0), new DateTime(d.Year, d.Month, d.Day, 15, 30, 0), "Appointment_Free_0", "", "")); radScheduler1.Appointments.Add(new Appointment(new DateTime(d.Year, d.Month, d.Day, 17, 30, 0), new DateTime(d.Year, d.Month, d.Day, 17, 30, 0), "Appointment_Free_0", "", "")); radScheduler1.ActiveViewType = SchedulerViewType.Day; radScheduler1.EnableExactTimeRendering = true; } Workaround: use a custom DayViewAppointmentsTable this.radScheduler1.ElementProvider = new MyElementProvider(this.radScheduler1); public class MyElementProvider : SchedulerElementProvider { public MyElementProvider(RadScheduler scheduler) : base(scheduler) { } protected override T CreateElement<T>(SchedulerView view, object context) { if (typeof(T) == typeof(DayViewAppointmentsTable)) { return new CustomDayViewAppointmentsTable(view.Scheduler, view, (DayViewAppointmentsArea)context)as T; } return base.CreateElement<T>(view, context); } } public class CustomDayViewAppointmentsTable : DayViewAppointmentsTable { public CustomDayViewAppointmentsTable(RadScheduler scheduler, SchedulerView view, DayViewAppointmentsArea area) : base(scheduler, view, area) { } protected override IEnumerable<AppointmentElement> CreateAppointmentElements() { if (this.View != null) { IList<IEvent> appointmentsInView = new List<IEvent>(this.View.Appointments); List<AppointmentElement> elements = DivideAppointmentToElements(appointmentsInView); elements.Sort(0, elements.Count, new DateTimeComparer(this.Scheduler)); foreach (AppointmentElement currentAppointment in elements) { currentAppointment.RelatedAppointments.Clear(); currentAppointment.DesiredBounds = new RectangleF(); } foreach (AppointmentElement appointment in elements) { List<AppointmentElement> intersectingAppointments = this.GetAllAppointmentsInDay(appointment.Start.Day, elements); intersectingAppointments.Remove(appointment); appointment.RelatedAppointments = intersectingAppointments; } return elements; } else { return new List<AppointmentElement>(); } } private List<AppointmentElement> GetAllAppointmentsInDay(int day, List<AppointmentElement> elements) { List<AppointmentElement> result = new List<AppointmentElement>(); foreach (AppointmentElement appointment in elements) { if (appointment.Start.Day == day) { result.Add(appointment); } } return result; } private List<AppointmentElement> DivideAppointmentToElements(IList<IEvent> appointmentsInView) { List<AppointmentElement> childAppointments = new List<AppointmentElement>(); TimeSpan startTime = TimeSpan.FromMinutes(this.GetDayViewBase().RulerStartScale * 60 + this.GetDayViewBase().RulerStartScaleMinutes); TimeSpan endTime = TimeSpan.FromMinutes(this.GetDayViewBase().RulerEndScale * 60 + this.GetDayViewBase().RulerEndScaleMinutes); foreach (IEvent app in appointmentsInView) { SchedulerDayViewBase dayView = this.GetDayViewBase(); bool allDay = (dayView != null) ? dayView.IsAllDayEvent(app) : false; DateTime appStart = this.View.DefaultTimeZone.OffsetTime(app.Start, this.Scheduler.SystemTimeZone); DateTime appEnd = this.View.DefaultTimeZone.OffsetTime(app.End, this.Scheduler.SystemTimeZone); if (!allDay) { // Handle > 1 day appointments if (appStart.Day != appEnd.Day && !(appEnd.Day - appStart.Day == 1 && appEnd.TimeOfDay == TimeSpan.Zero)) { AppointmentElement appointment1 = this.CreateAppointmentElement(this.Scheduler, this.View, app); appointment1.Start = appStart; appointment1.End = DateHelper.GetEndOfDay(appStart); if (appointment1.Start.TimeOfDay >= endTime) { appointment1.Start = new DateTime(appStart.Year, appStart.Month, appStart.Day, 0, 0, 0).Add(endTime).AddMinutes(-(int)this.GetDayViewBase().RangeFactor); } AppointmentElement appointment2 = this.CreateAppointmentElement(this.Scheduler, this.View, app); appointment2.Start = appEnd.Date; appointment2.End = appEnd; if (appointment1.Start >= this.View.StartDate) { childAppointments.Add(appointment1); } if (appointment2.Start >= this.View.StartDate) { childAppointments.Add(appointment2); } } else { AppointmentElement appointment1 = this.CreateAppointmentElement(this.Scheduler, this.View, app); appointment1.Start = appStart; appointment1.End = appEnd; if (appointment1.Start.TimeOfDay < startTime) { appointment1.Start = new DateTime(appStart.Year, appStart.Month, appStart.Day, 0, 0, 0).Add(startTime); } if (appointment1.Start.TimeOfDay >= endTime) { appointment1.Start = new DateTime(appStart.Year, appStart.Month, appStart.Day, 0, 0, 0).Add(endTime).AddMinutes(-(int)this.GetDayViewBase().RangeFactor); } if (appointment1.End.TimeOfDay > endTime) { appointment1.End = new DateTime(appEnd.Year, appEnd.Month, appEnd.Day, 0, 0, 0).Add(endTime); } if (appointment1.End.TimeOfDay <= startTime) { appointment1.End = new DateTime(appEnd.Year, appEnd.Month, appEnd.Day, 0, 0, 0).Add(startTime).AddMinutes((int)this.GetDayViewBase().RangeFactor); } childAppointments.Add(appointment1); } } else if (!dayView.ShowAllDayArea) { DateTimeInterval viewInterval = new DateTimeInterval(this.View.StartDate, DateHelper.GetEndOfDay(this.View.EndDate)); AppointmentElement appointment1 = this.CreateAppointmentElement(this.Scheduler, this.View, app); appointment1.Start = appStart; appointment1.End = DateHelper.GetEndOfDay(appStart); DateTimeInterval interval = new DateTimeInterval(appStart, appointment1.End); if (interval.IntersectsWith(viewInterval)) { if (appointment1.Start.TimeOfDay < startTime) { appointment1.Start = new DateTime(appStart.Year, appStart.Month, appStart.Day, 0, 0, 0).Add(startTime); } if (appointment1.Start.TimeOfDay >= endTime) { appointment1.Start = new DateTime(appStart.Year, appStart.Month, appStart.Day, 0, 0, 0).Add(endTime).AddMinutes(-(int)this.GetDayViewBase().RangeFactor); } if (appointment1.End.TimeOfDay > endTime) { appointment1.End = new DateTime(appEnd.Year, appEnd.Month, appEnd.Day, 0, 0, 0).Add(endTime); } if (appointment1.End.TimeOfDay <= startTime) { appointment1.End = new DateTime(appEnd.Year, appEnd.Month, appEnd.Day, 0, 0, 0).Add(startTime).AddMinutes((int)this.GetDayViewBase().RangeFactor); } childAppointments.Add(appointment1); } DateTime startDate = appStart.AddDays(1).Date; AppointmentElement appointment2 = null; while (startDate <= appEnd.Date.AddDays(-1)) { appointment2 = this.CreateAppointmentElement(this.Scheduler, this.View, app); appointment2.Start = startDate; appointment2.End = DateHelper.GetEndOfDay(startDate); interval = new DateTimeInterval(appointment2.Start, appointment2.End); if (interval.IntersectsWith(viewInterval)) { childAppointments.Add(appointment2); } startDate = startDate.AddDays(1); } DateTime endDate = appEnd.Date; DateTime endAppointmentDate = appEnd; appointment2 = this.CreateAppointmentElement(this.Scheduler, this.View, app); appointment2.Start = endDate; appointment2.End = endAppointmentDate; interval = new DateTimeInterval(endDate, endAppointmentDate); if (interval.IntersectsWith(viewInterval) && interval.Start != appStart) { childAppointments.Add(appointment2); } } } return childAppointments; } private AppointmentElement CreateAppointmentElement(RadScheduler scheduler, SchedulerView view, IEvent appointment) { AppointmentElement appointmentElement = null; if (scheduler.AppointmentElementFactory != null) { appointmentElement = scheduler.AppointmentElementFactory.CreateAppointmentElement(scheduler, view, appointment); } else { appointmentElement = scheduler.ElementProvider.GetElement<AppointmentElement>(view, appointment); } return appointmentElement; } }
To reproduce: this.radScheduler1.ActiveViewType = Telerik.WinControls.UI.SchedulerViewType.Month; SchedulerMonthView monthView = this.radScheduler1.GetMonthView(); monthView.WeekCount = 5; monthView.EnableCellOverflowButton = false; monthView.EnableAppointmentsScrolling = true; monthView.ShowVerticalNavigator = false; for (int i = 0; i < 5; i++) { this.radScheduler1.Appointments.Add(new Appointment(DateTime.Now, TimeSpan.FromDays(2), "Test" + i)); } for (int i = 5; i < 10; i++) { this.radScheduler1.Appointments.Add(new Appointment(DateTime.Now.AddDays(7), TimeSpan.FromDays(2), "Test" + i)); } for (int i = 10; i < 15; i++) { this.radScheduler1.Appointments.Add(new Appointment(DateTime.Now.AddDays(14), TimeSpan.FromDays(2), "Test" + i)); } this.radScheduler1.Appointments.Add(new Appointment(DateTime.Now.AddMinutes(5),TimeSpan.FromDays(8),"Last")); this.radScheduler1.Appointments.Add(new Appointment(DateTime.Now, TimeSpan.FromDays(14), "A")); this.radScheduler1.Appointments.Add(new Appointment(DateTime.Now.AddDays(7), TimeSpan.FromDays(20), "B")); Workaround: use the cell overflow button: SchedulerMonthView.EnableCellOverflowButton=true.
Workaround: use your own icon: public Form1() { InitializeComponent(); this.radScheduler1.RecurrenceEditDialogShowing+=radScheduler1_RecurrenceEditDialogShowing; } private void radScheduler1_RecurrenceEditDialogShowing(object sender, Telerik.WinControls.UI.RecurrenceEditDialogShowingEventArgs e) { ((RadForm)e.RecurrenceEditDialog).Icon = Properties.Resources.WinFormsIcon; }
Add the ability to display the text in appointments vertically.
Description: Using the AppointmentFormatting event, setting the AppointmentElement's TextOrientation property to Vertical should paint the content text in the corresponding orientation.
To reproduce: public Form1() { InitializeComponent(); this.radScheduler1.ActiveViewType = Telerik.WinControls.UI.SchedulerViewType.Timeline; this.radScheduler1.EnableGesture(Telerik.WinControls.GestureType.Pan); this.radScheduler1.DisableGesture(Telerik.WinControls.GestureType.Zoom); this.radScheduler1.ZoomGesture+=radScheduler1_ZoomGesture; this.radScheduler1.PanGesture+=radScheduler1_PanGesture; } private void radScheduler1_PanGesture(object sender, Telerik.WinControls.PanGestureEventArgs e) { Console.WriteLine("Pan should fire"); } private void radScheduler1_ZoomGesture(object sender, Telerik.WinControls.ZoomGestureEventArgs e) { Console.WriteLine("Zoom should NOT fire"); } Workaround: public class CustomScheduler : RadScheduler { public override string ThemeClassName { get { return typeof(RadScheduler).FullName; } } protected override void OnZoomGesture(Telerik.WinControls.ZoomGestureEventArgs args) { //stop the basic logic //base.OnZoomGesture(args); } }
Workaround: public class MyTimelineGroupingByResourcesElement : TimelineGroupingByResourcesElement { public MyTimelineGroupingByResourcesElement(RadScheduler scheduler, SchedulerView view) : base(scheduler, view) { } public override void NavigateForward() { TimeSpan ts = (this.View as SchedulerTimelineView).RangeEndDate - this.View.StartDate; int differenceInDays = ts.Days; int displayedCells = (this.View as SchedulerTimelineView).GetScaling().DisplayedCellsCount; if (differenceInDays >= displayedCells) { base.NavigateForward(); } } } public class MyElementProvider : SchedulerElementProvider { public MyElementProvider(RadScheduler scheduler) : base(scheduler) { } protected override T CreateElement<T>(SchedulerView view, object context) { if (typeof(T) == typeof(TimelineGroupingByResourcesElement)) { return new MyTimelineGroupingByResourcesElement(this.Scheduler, view) as T; } return base.CreateElement<T>(view, context); } } public RadForm2() { InitializeComponent(); this.radScheduler1.ElementProvider = new MyElementProvider(this.radScheduler2); }
To reproduce: 1. Add a RadDock with one DocumentWindow. 2. Place a RadSchedulerNavigator in the DocumentWindow. 3. Add a RadButton and use the following code snippet: private void radButton1_Click(object sender, EventArgs e) { this.radSchedulerNavigator1.SchedulerNavigatorElement.TimeZonesDropDown.SelectedIndexChanging += TimeZonesDropDown_SelectedIndexChanging; string path = @"..\..\layout.xml"; this.radDock1.SaveToXml(path); this.radDock1.LoadFromXml(path); RadScheduler sched = new RadScheduler(); this.documentWindow1.Controls.Add(sched); sched.Dock = DockStyle.Left; this.radSchedulerNavigator1.AssociatedScheduler = this.documentWindow1.Controls[1] as RadScheduler; } After running the application and clicking the button, you will notice that RadScheduler has time zone "Casablanca" but the RadSchedulerNavigator has a different time zone. Workaround: associate the RadSchedulerNavigator before loading the layout.
To reproduce: public Form1() { InitializeComponent(); this.radScheduler1.Appointments.Add(new Appointment(DateTime.Today.AddHours(1),TimeSpan.FromHours(3),"Meeting")); this.radScheduler1.ActiveViewType = SchedulerViewType.Week; this.radScheduler1.GetWeekView().RangeFactor = ScaleRange.HalfHour; this.radScheduler1.SchedulerElement.DragDropBehavior.AutoScrollDayViewOnDrag = true; this.Size = new Size(800, 350); } It's necessary to stretch down the application so that a few hours are shown (let's say 4 hours) and the appointment is a bit less, for example 3 hours. If you look at the gif, I am scrolling down around 14, then I'm stopping a bit, while always keeping the mouse button pressed, and then I start scrolling up: at that time the scroll results in going down until 19, instead of going up. Workaround: this.radScheduler1.SchedulerElement.DragDropBehavior = new CustomAppointmentDraggingBehavior(this.radScheduler1.SchedulerElement); public class CustomAppointmentDraggingBehavior : AppointmentDraggingBehavior { public CustomAppointmentDraggingBehavior(SchedulerVisualElement activeOwner) : base(activeOwner) { } protected override void HandleMouseMove(Point mousePos) { base.HandleMouseMove(mousePos); DayViewAppointmentsTable table = this.ActiveOwner.Scheduler.DragDropBehavior.ActiveOwner as DayViewAppointmentsTable; if (table != null && this.ActiveOwner.Scheduler.DragDropBehavior.AutoScrollDayViewOnDrag) { Point pt = table.PointFromScreen(Control.MousePosition); FieldInfo fi = typeof(DayViewAppointmentsTable).GetField("lastMovingPoint", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); fi.SetValue(table, pt); } } }
Workaround: subscribe to the PanGesture event and set the StartDate property of the current view to the desired new date.
To reproduce: - Bind the scheduler to the default SchedulerData.mdb - Add an appointment like this: this.radScheduler1.Appointments.BeginUpdate(); Appointment appointment = CreateAppointment(); this.radScheduler1.Appointments.Add(appointment); this.radScheduler1.Appointments.EndUpdate(); - Save the database
RadScheduler/RadSchedulerNavigator crashes upon BindingContext change during being/end initialize