To reproduce: Resource lResource; var LColors = new Color[5]; SchedulerMultiDayView multyDayView; DateTime startDate; int interval; radScheduler1.Statuses.Add(new AppointmentStatusInfo(5, "New", Color.Green, Color.Green, AppointmentStatusFillType.Solid)); radScheduler1.Statuses.Add(new AppointmentStatusInfo(6, "ACCP", Color.DarkOrange, Color.DarkOrange, AppointmentStatusFillType.Solid)); lResource = new Resource(); lResource.Id = new EventId(1); lResource.Name = "Bert"; lResource.Color = Color.Red; radScheduler1.Resources.Add(lResource); radScheduler1.ActiveView.ShowHeader = true; this.radScheduler1.ActiveViewType = SchedulerViewType.MultiDay; multyDayView = this.radScheduler1.GetMultiDayView(); startDate = DateTime.Today; interval = 30; radScheduler1.GroupType = GroupType.Resource; multyDayView.Intervals.Add(startDate, interval); multyDayView.RulerScaleSize = 4; radScheduler1.EnableExactTimeRendering = true; multyDayView.RangeFactor = ScaleRange.Hour;
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: 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); } }
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; }
Please refer to the attached screenshots. A sample project is attached. There is a known issue in the .NET Framework considering the "fa-IR" culture. Please refer to the following MSDN resource for a solution which is included in the sample project: https://code.msdn.microsoft.com/Fixing-Persian-Locale-for-6e66e044#content Workaround: private void radScheduler1_CellFormatting(object sender, SchedulerCellEventArgs e) { MonthCellElement monthCellElement = e.CellElement as MonthCellElement; if (monthCellElement != null) { monthCellElement.Header.Text = monthCellElement.Date.ToString("dd", this.radScheduler1.Culture); } }
To reproduce: please refer to the attached gif file Dim a1 As New Appointment(DateTime.Today.AddDays(-1), TimeSpan.FromDays(3), "Termin1") a1.AllDay = True Dim a2 As New Appointment(DateTime.Today.AddDays(-1), TimeSpan.FromDays(1), "Termin2") a2.AllDay = True Me.RadScheduler1.Appointments.Add(a1) Me.RadScheduler1.Appointments.Add(a2) Workaround: specify precisely the end date including the time part as well Dim a1 As New Appointment(DateTime.Today.AddDays(-1), TimeSpan.FromDays(3).Add(TimeSpan.FromMinutes(1)), "Termin1") a1.AllDay = False Dim a2 As New Appointment(DateTime.Today.AddDays(-1), TimeSpan.FromDays(2).Add(TimeSpan.FromMinutes(1)), "Termin2") a2.AllDay = False Me.RadScheduler1.Appointments.Add(a1) Me.RadScheduler1.Appointments.Add(a2)
Please refer to the attached file. Workaround: clear remind objects when the appointment is changed: private void radScheduler1_AppointmentChanged(object sender, AppointmentChangedEventArgs e) { schedulerReminder.ClearRemindObjects(); foreach (Appointment a in this.radScheduler1.Appointments) { schedulerReminder.AddRemindObject(a); } }
To reproduce: use a German TimeZone 1. Create a recurring appointment with a yearly recurrence rule on the last Sunday of October. 2. Export to iCal. As a result, the TimeZone information is not correct. The exported RRULE BYSETPOS=5 defines the 5th Sunday. This is wrong. There may be a year with 5 Sundays in March/October but that is not true for every year. The correct encoding for ics files is BYSETPOS=-1. This indicates the last Sunday of a month. The other error is the DTSTART:16010101T030000 and DTSTART:00010101T020000. The German daylight rule is valid since 1996, not since 1601 or year 1. Note: German timezone defines the switch to daylight saving time as - start on last Sunday in March at 03:00 - end on last Sunday in October at 02:00 This rule is valid since 1996. Alert: Events created in RadScheduler for the last Sunday of a month are correct! The rule here is exported as expected and contains BYSETPOS=-1:
To reproduce: public Form1() { InitializeComponent(); this.radScheduler1.ActiveViewType = SchedulerViewType.Timeline; Timescales scale = Timescales.Hours; this.radScheduler1.GetTimelineView().ShowTimescale(scale); Appointment app1 = new Appointment(DateTime.Today.AddHours(6), TimeSpan.FromMinutes(25), "A1"); Appointment app2 = new Appointment(DateTime.Today.AddHours(6).AddMinutes(25), TimeSpan.FromMinutes(16), "A2"); Appointment app3 = new Appointment(DateTime.Today.AddHours(6).AddMinutes(41), TimeSpan.FromMinutes(12), "A3"); this.radScheduler1.Appointments.Add(app1); this.radScheduler1.Appointments.Add(app2); this.radScheduler1.Appointments.Add(app3); this.radScheduler1.EnableExactTimeRendering = true; } Workaround: 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(TimelineAppointmentsPresenter)) { return new CustomTimelineAppointmentsPresenter(this.Scheduler, view, (SchedulerTimelineViewElement)context)as T; } return base.CreateElement<T>(view, context); } } public class CustomTimelineAppointmentsPresenter: TimelineAppointmentsPresenter { public CustomTimelineAppointmentsPresenter(RadScheduler scheduler, SchedulerView view, SchedulerTimelineViewElement timelineViewElement) : base(scheduler, view, timelineViewElement) { } protected override void ResolveOverlappingAppointments(SizeF availableSize) { List<AppointmentElement> appointments = new List<AppointmentElement>(); foreach (AppointmentElement element in this.AppointmentElements) { if (element.Visibility != ElementVisibility.Collapsed) { appointments.Add(element); } } appointments.Sort(new DateTimeComparer(this.Scheduler)); List<AppointmentElement> arrangedAppointments = new List<AppointmentElement>(); foreach (AppointmentElement appointment in appointments) { for (int i = 0; i < arrangedAppointments.Count; i++) { AppointmentElement otherAppointment = arrangedAppointments[i]; if (otherAppointment == appointment) { continue; } RectangleF rect = appointment.DesiredBounds; rect.Inflate(new SizeF(-2,-2)); if (otherAppointment.DesiredBounds.IntersectsWith(rect)) { appointment.DesiredBounds.Y = otherAppointment.DesiredBounds.Bottom; i = -1; continue; } } arrangedAppointments.Add(appointment); } } }
Workaround: private void radScheduler1_CellFormatting(object sender, Telerik.WinControls.UI.SchedulerCellEventArgs e) { if (e.CellElement is SchedulerHeaderCellElement && e.CellElement.Text == "Local") { e.CellElement.TextAlignment = ContentAlignment.BottomLeft; } }
Note: If you open the context menu over a recurring appointment and select "Edit Appointment", when the EditAppointmentDialogis shown, the EditRecurrenceDialog is shown as well. But when the EditAppointmentDialog is shown by double clicking, the EditRecurrenceDialog is not opened at all. Workaround: this.radScheduler1.SchedulerInputBehavior = new CustomBehavior(this.radScheduler1); public class CustomBehavior : SchedulerInputBehavior { public CustomBehavior(RadScheduler scheduler) : base(scheduler) { } public override bool HandleAppointmentElementDoubleClick(object sender, EventArgs args) { MouseEventArgs mouseArgs = args as MouseEventArgs; if (mouseArgs == null || mouseArgs.Button != MouseButtons.Left) { return false; } FieldInfo fi = typeof(SchedulerInputBehavior).GetField("beginEditTimer", BindingFlags.NonPublic| BindingFlags.Instance); Timer beginEditTimer = fi.GetValue(this) as Timer; beginEditTimer.Stop(); if (!this.Scheduler.ReadOnly && sender is AppointmentElement) { AppointmentElement app = sender as AppointmentElement; this.Scheduler.ShowAppointmentEditDialog(app.Appointment, app.Appointment.MasterEvent != null); } return false; } }
To reproduce: 1. Follow the steps for creating custom Appointment as it is demonstrated here: http://www.telerik.com/help/winforms/scheduler-appointments-and-dialogs-adding-a-custom-field-to-the-editappointment-dialog.html 2. Create a new Appointment and press Ctrl+C to copy the selected custom appointment. 3. Press Ctrl+V to paste. You will notice that the pasted appointment is from the default type, not the custom one. Workaround: this.radScheduler1.AppointmentsCopying += radScheduler1_AppointmentsCopying; this.radScheduler1.AppointmentsPasting += radScheduler1_AppointmentsPasting; private void radScheduler1_AppointmentsCopying(object sender, SchedulerClipboardEventArgs e) { email = ((AppointmentWithEmail)this.radScheduler1.SelectionBehavior.SelectedAppointments.First()).Email; } private void radScheduler1_AppointmentsPasting(object sender, SchedulerClipboardEventArgs e) { e.Cancel = true; if (e.Format == "ICal") { DataObject clipboardObject = Clipboard.GetDataObject() as DataObject; if (clipboardObject == null) { return; } string ical = Convert.ToString(clipboardObject.GetData(RadScheduler.ICalendarDataFormat)); bool pasteResult = PasteFromICal(ical); } } private bool PasteFromICal(string ical) { SchedulerICalendarImporter importer = new SchedulerICalendarImporter( this.radScheduler1.AppointmentFactory); SnapshotAppointmentsSchedulerData data = new SnapshotAppointmentsSchedulerData(this.radScheduler1, null); importer.Import(data, ical); ISchedulerStorage<IEvent> storage = data.GetEventStorage(); if (storage == null || storage.Count == 0) { return false; } IEnumerator<IEvent> enumerator = storage.GetEnumerator(); enumerator.MoveNext(); TimeSpan pasteOffset = this.radScheduler1.SelectionBehavior.SelectionStartDate - enumerator.Current.Start; enumerator.Dispose(); foreach (IEvent appointment in storage) { TimeSpan oldDuration = appointment.Duration; appointment.Start = appointment.Start.Add(pasteOffset); appointment.Duration = oldDuration; appointment.UniqueId = new EventId(Guid.NewGuid()); ((AppointmentWithEmail)appointment).Email = email; if (appointment.RecurrenceRule != null && appointment.Exceptions != null) { foreach (IEvent exception in appointment.Exceptions) { oldDuration = exception.Duration; exception.Start = exception.Start.Add(pasteOffset); exception.Duration = oldDuration; exception.UniqueId = new EventId(Guid.NewGuid()); } } if (this.radScheduler1.GroupType == GroupType.Resource) { appointment.ResourceId = this.radScheduler1.SelectionBehavior.SelectedResourceId; } } foreach (IEvent appointment in storage) { this.radScheduler1.Appointments.Add(appointment); } return true; }
Workaround: SchedulerBindingDataSource schedulerBindingSource = new SchedulerBindingDataSource(); schedulerBindingSource.EventProvider.ResourceMapperFactory = new MyResourceMapperFactory(schedulerBindingSource); class MyResourceMapperFactory : Telerik.WinControls.UI.Scheduler.ResourceMapperFactory { public MyResourceMapperFactory(SchedulerBindingDataSource owner) : base(owner) { } public override Telerik.WinControls.UI.Scheduler.ResourceIdMapper GetResourceMapper(object dataSourceItem, PropertyDescriptor resourceIdDescriptor) { if (resourceIdDescriptor == null) { resourceIdDescriptor = GetResourceIdDescriptor(dataSourceItem); } return base.GetResourceMapper(dataSourceItem, resourceIdDescriptor); } private PropertyDescriptor GetResourceIdDescriptor(object resourceIdList) { string resourceIdPropertyName = ((AppointmentMappingInfo)this.OwnerDataSource.EventProvider.Mapping).ResourceId; if (string.IsNullOrEmpty(resourceIdPropertyName)) return null; System.Collections.IList list = resourceIdList as System.Collections.IList; Type listType = resourceIdList.GetType(); if (list == null && listType.IsGenericType && listType.GetGenericArguments().Length == 1) { Type[] genericArguments = listType.GetGenericArguments(); PropertyDescriptorCollection resourceProperties = TypeDescriptor.GetProperties(genericArguments[0]); return resourceProperties.Find(resourceIdPropertyName, true); } else { PropertyDescriptorCollection resourceProperties = ListBindingHelper.GetListItemProperties(resourceIdList); return resourceProperties.Find(resourceIdPropertyName, true); } } }
To reproduce: use the following code: public Form1() { InitializeComponent(); Appointment recurringAppointment = new Appointment(DateTime.Now, TimeSpan.FromHours(1.0), "Appointment Subject"); HourlyRecurrenceRule rrule = new HourlyRecurrenceRule(recurringAppointment.Start, 2, 10); recurringAppointment.RecurrenceRule = rrule; this.radScheduler1.Appointments.Add(recurringAppointment); } From the scheduler navigator change the time zone to any zone with "-". You will notice that some of the occurrences disappear.
To reproduce: use the code snippet from the documentation: http://www.telerik.com/help/winforms/scheduler-views-time-zones.html SchedulerTimeZone utcPlusOneTimeZone = new SchedulerTimeZone(-60, "UTC + 1"); this.radScheduler1.GetDayView().DefaultTimeZone = utcPlusOneTimeZone; Woraround: set the time zone by using the SchedulerTimeZone.GetSchedulerTimeZones() list.
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; } }