To reproduce:
Sub New()
InitializeComponent()
Dim colors() As Color = {Color.LightBlue, Color.LightGreen, Color.LightYellow, Color.Red, _
Color.Orange, Color.Pink, Color.Purple, Color.Peru, Color.PowderBlue}
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 = Me.RadScheduler1.Resources.Count
Me.RadScheduler1.ActiveViewType = SchedulerViewType.Timeline
Dim rand As New Random
For index = 1 To 20
Dim a As New Appointment(DateTime.Now.AddDays(index), TimeSpan.FromHours(2), "A" & index)
a.ResourceId = Me.RadScheduler1.Resources(rand.Next(0, Me.RadScheduler1.Resources.Count)).Id
Me.RadScheduler1.Appointments.Add(a)
Next
Dim timelineView As SchedulerTimelineView = Me.RadScheduler1.GetTimelineView()
Dim oneMinute As New OneMinuteTimescale()
timelineView.SchedulerTimescales.Add(oneMinute)
oneMinute.Visible = True
End Sub
Public Class OneMinuteTimescale
Inherits MinutesTimescale
Public Overrides ReadOnly Property Name As String
Get
Return "OneMinuteTimescale"
End Get
End Property
Public Overrides ReadOnly Property ScalingFactor() As Integer
Get
Return 1
End Get
End Property
End Class
Workaround: decrease the range:
timelineView.RangeStartDate = DateTime.Today
timelineView.RangeEndDate = timelineView.RangeStartDate.AddDays(1)
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"));
}
In RadScheduler I have appointment with End set to new DateTime(9999, 12, 22) (or greater). When I switch to Month view the exception is thrown: The added or subtracted value results in an un-representable DateTime. Found in version: 2016.2.608.40 It was working in version: 2013.2.724.40
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: 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;
To reproduce:
Color[] colors = new Color[]
{
Color.LightBlue, Color.LightGreen, Color.LightYellow,
Color.Red, Color.Orange, Color.Pink, Color.Purple, Color.Peru, Color.PowderBlue
};
Random rand = new Random();
for (int i = 0; i < 25; i++)
{
Resource resource = new Resource();
resource.Id = new EventId(i);
resource.Name = i + ".Resource";
resource.Color = colors[rand.Next(0, colors.Length)];
this.radScheduler1.Resources.Add(resource);
}
this.radScheduler1.GroupType = GroupType.Resource;
this.radScheduler1.ActiveView.ResourcesPerView = this.radScheduler1.Resources.Count;
for (int i = 0; i < 3; i++)
{
Appointment a = new Appointment(DateTime.Now.AddHours(i), TimeSpan.FromMinutes(30), "A" + i);
a.ResourceId = this.radScheduler1.Resources.Last().Id;
this.radScheduler1.Appointments.Add(a);
}
NOTE: it is also valid for the horizontal scrollbar in Timeline view.
Workaround: use the SetResourceSize to increase the last resource's width a little bit: http://docs.telerik.com/devtools/winforms/scheduler/views/grouping-by-resources
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";
}
}
}
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.
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.
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;
}
}
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: 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)
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);
}
}