Please refer to the attached file.
If your current time is 9:30 AM and you have an appointment in 11:00 AM with reminder 6 hours, the alarm popup should be displayed at 5:00 AM. When you run the application and show the scheduler, the reminder pop up appears immediately. This behavior is expected. However, if you snooze the event with 1 hour, it is expected that the reminder for this appointment will not popup the next hour. However, the RadScheduler makes the following calculation: reminder start time - reminder value + snooze time = 11:00 - 6 + 1 = 6:00. Hence, the reminder popup shows immediately as the current time is 9:30h.
To reproduce: 1. Open Demo application >> Scheduler >> Printing example. 2. Change to Weekly style and return back to Daily style. 3. Modify a random appointment's end time to be half an hour, e.g. 10:30. 4. Change the rule scale to 5 minute and press PrintPreview button. You will notice that the rendered appointment in the PrintPreview dialog fills the entire hour interval, instead of half of it. 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); } } } private void radButton1_Click(object sender, EventArgs e) { this.radScheduler1.PrintPreview(); }
Add Reminder property to the AppointmentMappingInfo class.
The tooltip is displayed in in wrong position when it contains several lines.
To reproduce: public Form1() { InitializeComponent(); this.radScheduler1.GetDayView().RangeFactor = Telerik.WinControls.UI.ScaleRange.HalfHour; this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 11, 0, 0, 0), new DateTime(2014, 7, 21, 12, 0, 0, 0))); this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 15, 30, 45, 137 ), new DateTime(2014, 7, 21, 15, 30, 58, 600 ))); this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 10, 0, 0, 0 ), new DateTime(2014, 7, 21, 11, 0, 0, 0 ))); this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 15, 30, 19, 633 ), new DateTime(2014, 7, 21, 15, 30, 31, 253 ))); this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 15, 29, 20, 337 ), new DateTime(2014, 7, 21, 15, 29, 52, 767 ))); this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 13, 0, 0, 0 ), new DateTime(2014, 7, 21, 14, 0, 0, 0 ))); this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 15, 0, 0, 0 ), new DateTime(2014, 7, 21, 16, 0, 0, 0 ))); this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 15, 28, 15, 500 ), new DateTime(2014, 7, 21, 15, 28, 37, 310 ))); this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 14, 0, 0, 0 ), new DateTime(2014, 7, 21, 15, 0, 0, 0 ))); this.radScheduler1.Appointments.Add(new Appointment(new DateTime(2014, 7, 21, 15, 27, 19, 123 ), new DateTime(2014, 7, 21, 15, 27, 57, 357 ))); }
Implement similar functionality as the exact time rendering in Outlook (DayView) using the status area. Please refer to the attached screenshot.
To reproduce : 1. Add a RadScheduler and a RadToggleButton. 2. Use the following code snippet: Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.RadScheduler1.ActiveViewType = Telerik.WinControls.UI.SchedulerViewType.Timeline Dim colors As Color() = New Color() {Color.LightBlue, Color.LightGreen, Color.LightYellow, Color.Red, Color.Orange, Color.Pink, _ Color.Purple, Color.Peru, Color.PowderBlue} Dim names As String() = New String() {"Alan Smith", "Anne Dodsworth", "Boyan Mastoni", "Richard Duncan", "Maria Shnaider"} For i As Integer = 0 To names.Length - 1 Dim resource As New Resource() resource.Id = New EventId(i) resource.Name = names(i) resource.Color = colors(i) Me.RadScheduler1.Resources.Add(resource) Next Me.RadScheduler1.ActiveView.ResourcesPerView = 2 Dim timelineView As SchedulerTimelineView = Me.RadScheduler1.GetTimelineView() Dim scale As Timescales = Timescales.Hours timelineView.ShowTimescale(scale) timelineView.StartDate = DateTime.Now.Date.AddHours(5) timelineView.RangeStartDate = DateTime.Now.Date.AddHours(5) timelineView.RangeEndDate = DateTime.Now.Date.AddHours(15) timelineView.CurrentScale.DisplayedCellsCount = 10 End Sub Private Sub RadToggleButton1_ToggleStateChanged(sender As Object, args As StateChangedEventArgs) Handles RadToggleButton1.ToggleStateChanged If args.ToggleState = Telerik.WinControls.Enumerations.ToggleState.On Then Me.RadScheduler1.GroupType = GroupType.Resource Else Me.RadScheduler1.GroupType = GroupType.None End If End Sub Initially, the timeline view start from the correct hour (5 AM). However, the horizontal scroll bar allows you to navigate in right direction as the RangeEndDate is currently visible in the view. When you click the toggle button, the scheduler is grouped by resources and the timeline start is reset.
To reproduce: public Form1() { InitializeComponent(); for (int i = 0; i < 10; i++) { Appointment appointment = new Appointment(DateTime.Now.AddHours(i), TimeSpan.FromMinutes(30), "Summary", "Description"); appointment.StatusId = 2; appointment.BackgroundId = 6; this.radScheduler1.Appointments.Add(appointment); } this.radScheduler1.ActiveViewType = SchedulerViewType.Day; SchedulerDayView dayView = this.radScheduler1.GetDayView(); dayView.RangeFactor = ScaleRange.FiveMinutes; dayView.RulerStartScale = DateTime.Now.Hour - 1; this.radScheduler1.EnableExactTimeRendering = true; }
RadScheduler the ruler is not displayed correctly with the office2010 themes.
To reproduce scroll to the working hours in the ActiveViewChanged event: void radScheduler1_ActiveViewChanged(object sender, Telerik.WinControls.UI.SchedulerViewChangedEventArgs e) { if (e.OldView.ViewType == SchedulerViewType.Month && (e.NewView.ViewType == SchedulerViewType.Day || e.NewView.ViewType == SchedulerViewType.Week)) { SchedulerDayViewBase dayView = radScheduler1.ActiveView as SchedulerDayViewBase; dayView.AutoScrollToWorkTime = true; } } Workaround: public class MyScheduler : RadScheduler { public override string ThemeClassName { get { return typeof(RadScheduler).FullName; } } protected override void SetValuesToViewElement(SchedulerVisualElement viewElement, ViewData viewData) { if (viewElement is SchedulerDayViewElement) { return; } base.SetValuesToViewElement(viewElement, viewData); } }
To reproduce: - Add a recurrence appointment with a reminder to a blank RadScheduler. - Delete single occurrence and wait for the reminder form to show. - You will notice that the deleted occurrence still exist in the form's grid.
To reproduce: Sub New() InitializeComponent() Dim colors() As Color = {Color.LightBlue, Color.LightGreen, Color.LightYellow, Color.Red, Color.Orange} Dim names() As String = {"Alan Smith", "Anne Dodsworth", "Boyan Mastoni", "Richard Duncan", "Maria Shnaider"} For i As Integer = 0 To names.Length - 1 Dim resource As New Telerik.WinControls.UI.Resource() resource.Id = New EventId(i) resource.Name = names(i) resource.Color = colors(i) Me.RadScheduler1.Resources.Add(resource) Next i Me.RadScheduler1.GroupType = GroupType.Resource Me.RadScheduler1.ActiveView.ResourcesPerView = 2 Dim rand As New Random For index = 1 To 20 Dim appointment As New Appointment(Date.Now.AddHours(index), TimeSpan.FromMinutes(30), "Summary", "Description") appointment.StatusId = RadScheduler1.Statuses(rand.Next(0, RadScheduler1.Statuses.Count)).Id appointment.BackgroundId = RadScheduler1.Backgrounds(rand.Next(0, RadScheduler1.Backgrounds.Count)).Id appointment.ResourceId = RadScheduler1.Resources(rand.Next(0, RadScheduler1.Resources.Count)).Id Me.RadScheduler1.Appointments.Add(appointment) Next RadSchedulerLocalizationProvider.CurrentProvider = New CustomSchedulerLocalizationProviderInglese() End Sub Public Class CustomSchedulerLocalizationProviderInglese Inherits RadSchedulerLocalizationProvider Public Overrides Function GetLocalizedString(id As String) As String Return MyBase.GetLocalizedString(id) End Function End Class
The AppointmentResizeEnd event fires in cases where there was no resize done (for example when selecting appointments) To workaround: public Form1() { InitializeComponent(); this.radScheduler1.SchedulerElement.ResizeBehavior = new MyResizeBehavior(this.radScheduler1); } class MyResizeBehavior : AppointmentResizingBehavior { public MyResizeBehavior(RadScheduler scheduler) :base(scheduler) { } public override bool EndResize(IEvent appointment) { if (!this.IsResizing) { return false; } return base.EndResize(appointment); } }
Add support for parsing hourly recurrence rules from a database.
To reproduce: - Open an appointment with the open item button from the alarm form. - Change the appointment start time and close it. - The "Due in' column in the grid is not properly updated.
To reproduce: 1. Add a RadSheduler with one Appointment with more than one resources (e.g. add two EventIds in its ResourceIds collection). 2.Group the scheduler by resources setting the GroupType property to GroupType.Resource. 3.Use SchedulerViewType.Timeline. When you try to resize the appointment for one of the resources, the expected result is this appointment to be resized for all of its resources. Workaround: Use the AppointmentMouseUp event and manually perform the refresh: Private Sub sched_AppointmentMouseUp(sender As Object, e As SchedulerAppointmentMouseEventArgs) If e.Button = Windows.Forms.MouseButtons.Left Then Me.sched.SchedulerElement.Refresh() End If End Sub
To reproduce: public Form1() { InitializeComponent(); List<string> resources = new List<string>(); for (int index = 1; index <= 30; index++) { resources.Add("Resource" + index); } for (int i = 0; i <= resources.Count - 1; i++) { Resource resource = new Resource(); resource.Id = new EventId(i); resource.Name = resources[i]; this.RadSchedulerDemo.Resources.Add(resource); } this.RadSchedulerDemo.GroupType = GroupType.Resource; Appointment appointment = null; this.RadSchedulerDemo.ActiveViewType = SchedulerViewType.Timeline; TimelineGroupingByResourcesElement headerElement = this.RadSchedulerDemo.SchedulerElement.ViewElement as TimelineGroupingByResourcesElement; headerElement.ResourceHeaderWidth = 150; Random rand = new Random(); for (int i = 0; i <= 99; i++) { appointment = new Appointment(DateTime.Now.AddHours(i), new TimeSpan(30), "Summary" + i, "Description" + i, "location" + i); appointment.ResourceId = this.RadSchedulerDemo.Resources[rand.Next(0, this.RadSchedulerDemo.Resources.Count)].Id; appointment.BackgroundId = Convert.ToInt32(this.RadSchedulerDemo.Backgrounds[rand.Next(0, this.RadSchedulerDemo.Backgrounds.Count)].Id); this.RadSchedulerDemo.Appointments.Add(appointment); } this.RadSchedulerDemo.GetTimelineView().ShowTimescale(Timescales.Hours); SchedulerTimescale timescale1 = this.RadSchedulerDemo.GetTimelineView().GetScaling(); timescale1.DisplayedCellsCount = 30; this.RadSchedulerDemo.ActiveView.ResourcesPerView = 10; } Try to scroll to the last resource when you ResourcesPerView =2 and when ResourcesPerView =10. You will notice considerable difference in scrolling speed.
To reproduce: - Add RadScheduler to a blank form. - Set its AllowAppointmentResize property to false. - You will notice that the resize squares are not removed from the selected appointment.