To reproduce: this.radScheduler1.ActiveViewType = SchedulerViewType.Month; for (int i = 0; i < 10; i++) { this.radScheduler1.Appointments.Add(new Appointment(DateTime.Now.AddHours(i),TimeSpan.FromMinutes(30),"A"+i)); } Scroll to the bottom and try to select an appointment. You will notice that selection is not possible. The attached gif file illustrates the incorrect behavior. Workaround: use the overflow button by setting the SchedulerMonthView.EnableCellOverflowButton property to true: SchedulerMonthView monthView = this.radScheduler1.GetMonthView(); monthView.EnableCellOverflowButton = true;
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;
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; } }
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.
In Outlook, when the appontment height should be smaller than the height needed to accommodate 1 line of text, the appointment status size is being changed instead.
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.
Workaround: subscribe to the PanGesture event and set the StartDate property of the current view to the desired new date.
ADD. RadScheduler - add the ability to change the culture of the generated print document.
When in multi day view if many days are being added, each day visual becomes so narrow that the application practically becomes useless. If there is horizontal scroll bar the view could be stretched and the user would be able to scroll between the days.
RadScheduler/RadSchedulerNavigator crashes upon BindingContext change during being/end initialize
To reproduce: public Form1() { InitializeComponent(); this.radScheduler1.ActiveViewType = SchedulerViewType.Month; this.radScheduler1.Appointments.Add(new Appointment(new DateTime(9999,12,22),TimeSpan.FromMinutes(30),"A1")); }
To reproduce: Public Class Form1 Sub New() InitializeComponent() Me.RadScheduler1.EnableExactTimeRendering = True Dim dt = DateTime.Now Me.RadScheduler1.Appointments.Add(New Appointment(dt.AddMinutes(-10).AddSeconds(1), Now, "A1")) Me.RadScheduler1.Appointments.Add(New Appointment(dt.AddMinutes(-15), DateTime.Now.AddMinutes(-10), "A2")) Me.RadScheduler1.GetTimelineView().StartDate = DateAdd(DateInterval.Minute, -15, Now) Dim customScale As CustomTimescalePerMinute = New CustomTimescalePerMinute() Dim timelineView As SchedulerTimelineView = Me.RadScheduler1.GetTimelineView() timelineView.SchedulerTimescales.Add(customScale) timelineView.ShowTimescale(customScale) Dim currentScaling As SchedulerTimescale = timelineView.GetScaling() currentScaling.DisplayedCellsCount = 15 End Sub End Class Public Class CustomTimescalePerMinute Inherits MinutesTimescale Public Overrides ReadOnly Property ScalingFactor() As Integer Get Return 1 End Get End Property End Class Note: the attached gif file illustrates the behavior. Initially, the first appointment's end is not rendered in the correct time slot. After scrolling, it is displayed correctly. Workaround: force scrolling Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim t As SchedulerTimelineViewElement = TryCast(Me.RadScheduler1.SchedulerElement.ViewElement, SchedulerTimelineViewElement) Dim value = t.NavigationElement.Value t.NavigationElement.Value += 1 Me.RadScheduler1.SchedulerElement.RefreshViewElement() t.NavigationElement.Value = value End Sub
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); } } }
If you want to show the borders for the weekdays, the left most border is not shown because another element is over the cell. It is not possible to hide this top left cell and show the left border for Sunday.
This is reproducible not only with Material theme but with the other themes as well. Workaround: private void radScheduler1_CellFormatting(object sender, Telerik.WinControls.UI.SchedulerCellEventArgs e) { e.CellElement.ZIndex = 0; }
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
Implement similar functionality as the exact time rendering in Outlook (DayView) using the status area. Please refer to the attached screenshot.