Currently RadScheduler does not support undo/redo operations and history. CLOSED: This should be part of the business logic of your application and not built-in in RadScheduler
DECLINED: RadScheduler already supports saving/loading exceptions (set via the MasterEventId mapping property). The issue here seems to be in the database setup but the information provided is insufficient to reproduce the case. 1) Create new reccuring appointment 2) Open some occurrence of created reccuring appointment 3) Change end date, click OK Here will be first problem - reccuring on this occurence icon not changed (see attached screenshot). 4) Save data to DB 5) Try do delete saved occurence of reccuring appointment 6) Save data to DB Here is the second problem - this will not delete.
To reproduce: - add RadScheduler with several appointments and use the folllowing code: SchedulerDayView dayView = this.radScheduler1.GetDayView(); dayView.RangeFactor = ScaleRange.QuarterHour; dayView.RulerStartScale = 7; dayView.RulerEndScale = 18; Ensure that you have appointments with start before 7 AM and appointments with start after 18 PM. All appointments with start before 7 AM are displayed at the top of the view, but all appointments with start after 18 PM are not displayed. Workaround: public Form1() { InitializeComponent(); for (int i = 0; i < 20; i++) { Appointment appointment = new Appointment(DateTime.Now.AddHours(12 + i), TimeSpan.FromMinutes(30), "Summary", "Description"); appointment.StatusId = 2; appointment.BackgroundId = 6; this.radScheduler1.Appointments.Add(appointment); } SchedulerDayView dayView = this.radScheduler1.GetDayView(); dayView.RangeFactor = ScaleRange.QuarterHour; dayView.RulerStartScale = 7; dayView.RulerEndScale = 18; this.radScheduler1.AppointmentElementFactory = new CustomAppointmentElementFactory(); } public class CustomAppointmentElementFactory : IAppointmentElementFactory { AppointmentElement IAppointmentElementFactory.CreateAppointmentElement(RadScheduler scheduler, SchedulerView view, IEvent appointment) { return new CustomAppointmentElement(scheduler, view, appointment); } } public class CustomAppointmentElement : AppointmentElement { public CustomAppointmentElement(RadScheduler scheduler, SchedulerView view, IEvent appointment) : base(scheduler, view, appointment) { } protected override void OnParentChanged(Telerik.WinControls.RadElement previousParent) { base.OnParentChanged(previousParent); if (this.Scheduler.ActiveViewType == SchedulerViewType.Day) { if (this.Start.Hour > this.Scheduler.GetDayView().RulerEndScale) { this.Start = this.Start.Date.AddHours(this.Scheduler.GetDayView().RulerEndScale).AddMinutes(-(int)this.Scheduler.GetDayView().RangeFactor); } } } }
To reproduce: Add a Resource to RadScheduler: Resource res = new Resource(); res.Id = new EventId(199); res.Name = "John Doe"; radScheduler1.Resources.Add(res); Create a new appointment and set the resource: Appointment app = new Appointment(); app.Start = DateTime.Now; app.End = app.Start.AddHours(1); app.BackgroundId = 3; app.ResourceId = new EventId(199); radScheduler1.Appointments.Add(app); Subscribe to the CollectionChangedEvent: void Appointments_CollectionChanged(object sender, Telerik.WinControls.Data.NotifyCollectionChangedEventArgs e) { if (e.Action == Telerik.WinControls.Data.NotifyCollectionChangedAction.ItemChanged) { Debug.WriteLine("Property Changed = " + e.PropertyName); } } Run the application, open the appointment and click ok. You will notice that the event will fire. It should not fire since the EventId is the same. Workaround: Create a custom appointment following this article: http://www.telerik.com/help/winforms/scheduler-appointments-and-dialogs-adding-a-custom-field-to-the-editappointment-dialog.html and override the ResourceId property: public class App : Appointment { public override EventId ResourceId { get { return base.ResourceId; } set { if (!Object.Equals(this.ResourceId, value)) { base.ResourceId = value; } } } }
To reproduce: Set the following property: this.scheduler.SchedulerElement.EditorManager.EditorViewMode = SchedulerEditorViewMode.EditorDialog; After that when editing an appointment a small dialog should appear on the side of the appointment. You will notice that it is very hard to make the dialog appear and it is not very clear at what conditions. Workaround: Show the dialog whenever you need it. For example, when an appointment is clicked: this.scheduler.SchedulerElement.EditorManager.EditorViewMode = SchedulerEditorViewMode.EditorDialog; this.scheduler.MouseClick += scheduler_MouseClick; void scheduler_MouseClick(object sender, MouseEventArgs e) { if (this.scheduler.ElementTree.GetElementAtPoint(e.Location) as AppointmentElement != null) { this.scheduler.SchedulerElement.EditorManager.BeginEdit(); } }
To reproduce: Add a scheduler to a Form. Subscribe to the PropertyChanged of the active view: this.scheduler.ActiveView.PropertyChanged += ActiveView_PropertyChanged; Set the scheduler's ActiveViewType to Week and then Day, this will cause the StartDate to change. this.scheduler.ActiveViewType = SchedulerViewType.Week; this.scheduler.ActiveViewType = SchedulerViewType.Day; void ActiveView_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "StartDate") { Console.WriteLine(this.scheduler.ActiveView.GetType()); // results in WeekView Debugger.Break(); } } You will notice that even that the ActiveView is WeekView the StartDate is changed when setting the ActiveViewType to Day. The PropertyChanged event for StartDate should be fired for the appropriate new ViewType.
Description: Using the AppointmentFormatting event, setting the AppointmentElement's TextOrientation property to Vertical should paint the content text in the corresponding orientation.
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.
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
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); } }
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
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.
RadScheduler the ruler is not displayed correctly with the office2010 themes.
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; }
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.
Implement similar functionality as the exact time rendering in Outlook (DayView) using the status area. Please refer to the attached screenshot.
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 ))); }
The tooltip is displayed in in wrong position when it contains several lines.
Add Reminder property to the AppointmentMappingInfo class.
Please refer to the attached file.