Completed
Last Updated: 20 Jul 2021 07:50 by ADMIN
Release R3 2021

1) create new project with a radScheduler

2) add a new appointment with a subject of: <>

3) program will crash with System.InvalidOperationException: 'Collection was modified after the enumerator was instantiated.'

 

The program will crash even if you have additional text before the "<>" but having text after it will allow the program to continue running however, none of the text after the "<>" will display.

Completed
Last Updated: 07 Jun 2021 15:04 by ADMIN
Release R2 2021 SP1

Hello,

I found an issue when retrieving appointments using MultiDayView.GetAppointmentsInInterval

The issue occurs when creating a new appointment where AllDay is set to true
In the appointment, the Start and End date is automatically both set to the same value
When adding the appointment to the MultidayView and retrieving the appointments in interval (interval is set to 1 minute) the Appointment is not returned.
I guess the call only uses the Start and End date and not using the AllDay value

 

Grtz Patrick

Completed
Last Updated: 29 Dec 2020 14:23 by ADMIN
Release R1 2021
By default, each Appointment has two properties: ResourceId and ResourceIds. Usually, the ResourceId is used when you have only a single resource for the appointment. In case you have multiple resources for an appointment the ResourceIds collection is used. However, the current implementation of the EditAppointmentDialog uses a RadDropDownList for the resource selection. Thus, the user is not allowed to create an appointment and assign two resources to it. It can be achieved only programmatically. This is a common scenario when creating a meeting and you have at least two participants. A possible solution would be to replace the resources RadDropDownList with a RadCheckedDropDownList. Thus, the user will be able to select multiple resources.
Unplanned
Last Updated: 03 Nov 2020 05:39 by ADMIN
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
Completed
Last Updated: 30 Oct 2020 17:05 by ADMIN
Release R1 2021 (LIB 2020.3.1102)

Here is the code snippet:

    Sub New()

        InitializeComponent()

        Dim culture As CultureInfo = New CultureInfo("en-US")
        culture.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday
        culture.DateTimeFormat.CalendarWeekRule = CalendarWeekRule.FirstFourDayWeek
        Me.RadScheduler1.Culture = culture

        Me.RadScheduler1.ActiveViewType = Telerik.WinControls.UI.SchedulerViewType.Timeline
        Dim timelineView As SchedulerTimelineView = Me.RadScheduler1.GetTimelineView()
        Dim scale As Timescales = Timescales.Weeks
        timelineView.ShowTimescale(scale) 

    End Sub
 

    Private Sub RadForm1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim baseDate As DateTime = DateTime.Today
        Dim start As DateTime() = New DateTime() {baseDate.AddHours(14.0), baseDate.AddDays(1.0).AddHours(9.0), baseDate.AddDays(2.0).AddHours(13.0)}
        Dim [end] As DateTime() = New DateTime() {baseDate.AddHours(16.0), baseDate.AddDays(1.0).AddHours(15.0), baseDate.AddDays(2.0).AddHours(17.0)}



        Dim appointment As Appointment = Nothing
        For i As Integer = 0 To 2
            appointment = New Appointment(start(i), [end](i), "A" & i, "D" & i, "L" & i) 
            Me.RadScheduler1.Appointments.Add(appointment)
        Next

        Me.RadScheduler1.ActiveView.StartDate = New DateTime(2020, 10, 11)
    End Sub

You will notice that if the StartDate is changed the appointments occupy the wrong cells until you scroll horizontally and the view is updated.

Completed
Last Updated: 19 Oct 2020 13:35 by ADMIN
Release R3 2020 SP1
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 2
Category: Scheduler/Reminder
Type: Bug Report
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);
        }
    }
}
Completed
Last Updated: 19 Aug 2020 11:46 by ADMIN
Release R3 2018
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 2
Category: Scheduler/Reminder
Type: Feature Request
2

			
Completed
Last Updated: 15 Jun 2020 12:06 by ADMIN
Release R2 2020 SP1
Please refer to the attached gif files and the two projects. The project which uses Entity Framework doesn't generate a new record for the exceptional event. Without EF, it works OK.
Completed
Last Updated: 27 Apr 2020 07:37 by ADMIN
Release R2 2020
Created by: Ben
Comments: 1
Category: Scheduler/Reminder
Type: Feature Request
2

Hi,

I am using the CalHelper (as suggested by this) in order to convert RecurrenceRule back and forth to string in order to persist on the database.

With the minutely recurrence rule, it seems like the conversion is not done correctly.

Please check the below code:


            var recurrenceRule = new MinutelyRecurrenceRule();
            recurrenceRule.Start = new DateTime(2020, 4, 1);
            recurrenceRule.Interval = 30;
            recurrenceRule.End = new DateTime(2020, 4, 1, 2, 0, 0);
            var qString = CalHelper.RecurrenceRuleToString(recurrenceRule);
            RecurrenceRule recurrenceRule1;
            CalHelper.TryParseRecurrenceRule(qString, out recurrenceRule1);// recurrenceRule1 will be null

 

Is there a way to fix this issue?

Thanks,

Completed
Last Updated: 06 Dec 2019 14:27 by ADMIN
Release R1 2020 (LIB 2019.3.1209)
Created by: Bert
Comments: 5
Category: Scheduler/Reminder
Type: Bug Report
0

Please run the attached sample project and follow the steps illustrated in the gif file. Not always the selected appointment is dragged.

Workaround:

        public class CustomSchedulerInputBheavior : SchedulerInputBehavior
        {
            public CustomSchedulerInputBheavior(RadScheduler scheduler) : base(scheduler)
            {
            }

            Point mouseDownPosition = Point.Empty;
            public override bool HandleMouseDown(MouseEventArgs args)
            {
                mouseDownPosition = args.Location;
                return base.HandleMouseDown(args);
            }
            public override bool HandleMouseMove(MouseEventArgs args)
            {
                SchedulerCellElement cell = this.Scheduler.ElementTree.GetElementAtPoint(args.Location) as SchedulerCellElement;

                AppointmentElement appointment = this.Scheduler.ElementTree.GetElementAtPoint(args.Location) as AppointmentElement;
                if (appointment == null)
                {
                    appointment = this.Scheduler.ElementTree.GetElementAtPoint(this.mouseDownPosition) as AppointmentElement;
                }

                if (this.Scheduler.Behavior.ItemCapture != null && (this.Scheduler.Behavior.ItemCapture.Parent is RadScrollBarElement ||
                    this.Scheduler.Behavior.ItemCapture is RadScrollBarElement))
                {
                    return false;
                }

                if (this.Scheduler.Capture && args.Button == MouseButtons.Left)
                {
                     appointment = this.Scheduler.ElementTree.GetElementAtPoint(this.mouseDownPosition) as AppointmentElement;

                    FieldInfo fi = typeof(SchedulerInputBehavior).GetField("selecting", BindingFlags.Instance| BindingFlags.NonPublic);
                    bool selecting = (bool)fi.GetValue(this);
                    if (selecting)
                    {
                        if (cell != null && cell.AllowSelection && args.Button == MouseButtons.Left)
                        {
                            this.SelectCell(cell, true);
                        }
                    }
                    else if (this.Scheduler.SchedulerElement.ResizeBehavior.IsResizing)
                    {
                        this.Scheduler.SchedulerElement.ResizeBehavior.Resize(args.Location);
                    }
                    else if (appointment != null && IsRealDrag(args.Location))
                    {
                        this.Scheduler.Capture = false;
                        this.Scheduler.DragDropBehavior.BeginDrag((SchedulerVisualElement)appointment.Parent, appointment);
                        return true;
                    }
                }
                else
                {
                    if (appointment != null)
                    {
                        this.Scheduler.SchedulerElement.ResizeBehavior.RequestResize(appointment, (SchedulerVisualElement)appointment.Parent, false);
                    }
                    else
                    {
                        this.Scheduler.Cursor = Cursors.Default;
                    }
                }

                return false;
            }
            private void SelectCell(SchedulerCellElement cell, bool extend)
            {
                this.Scheduler.SelectionBehavior.SelectCell(cell, extend);
            }
        }

this.radScheduler1.SchedulerInputBehavior = new CustomSchedulerInputBheavior(this.radScheduler1);

Completed
Last Updated: 03 Oct 2019 11:50 by ADMIN
Release R3 2019 SP1 (LIB 2019.3.1007)
Created by: Andrea
Comments: 3
Category: Scheduler/Reminder
Type: Bug Report
1

Hi,

using a RadScheduler into a desktop application. It seems like, on mouse-down event happening into a cell of the first row, the grid of the scheduler is shifting down of a row, resulting in the mouse handle being on the previous row's cell. No mouse wheel scrolled, no other mouse movement. Just one left-click. The result is that on mouse-up we are in a different cell and our event-handler is getting confused.

Sorry for not having any code snippet, I just attach a video of what's happening. Consider that I have only positioned the mouse on the cell at 8am and left-clicked. Tested also with version 2019.2.508 (even though in our app we are still using 2016.2.608).

Thanks in advance and best regards,

Emanuele Nava
Apogeo srl
Italy

 

Completed
Last Updated: 24 Sep 2019 09:43 by ADMIN
Add the possibility either for the end user or the developer to modify the width or height (whichever is relevant) of the resource areas in different views.
Unplanned
Last Updated: 02 Jul 2019 13:24 by ADMIN
Created by: Bert
Comments: 3
Category: Scheduler/Reminder
Type: Bug Report
0

Currently, I’m using the Radscheduler MultiDayView to create a “two week” view in which the end user has the possibility to choose if he wants to see weekend days or not.
When this view is used in combination with appointments spanning multiple days and the display of the weekend days, every thing works fine (with_weekend.png). The appointment starts at 06/21/19 05:00 and ends 06/24/19 21:05.
However, if weekend days are not shown in this view (without_weekend.png), part of the same appointment is shown on 06/25/19 and the end time on 06/24/19 is also incorrect.

How can I solve this? It is not an option to show it as an “All day appointment” since the customer wants to know the exact start and end time.

Completed
Last Updated: 06 Jun 2019 13:27 by ADMIN
Release R2 2019 SP1 (LIB 2019.2.610)
Unplanned
Last Updated: 16 May 2019 05:11 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: Scheduler/Reminder
Type: Bug Report
5
To reproduce:
        Me.RadScheduler1.ActiveViewType = Telerik.WinControls.UI.SchedulerViewType.Timeline
        Dim timelineView As SchedulerTimelineView = Me.RadScheduler1.GetTimelineView()
        Dim currentScaling As SchedulerTimescale = timelineView.GetScaling()
        currentScaling.DisplayedCellsCount = 100

Try to scroll horizontally. Then, change the currentScaling.DisplayedCellsCount  property to 50 and try to scroll again. You will notice a considerable difference.

Workaround: reduce the number of the displayed visual cell elements by the DisplayedCellsCount.
Completed
Last Updated: 15 Feb 2019 17:02 by ADMIN

Hello,

We have developed an ASP.NET application and a WinForms application that both uses Telerik RadScheduler. The applications share the same data.

We have set EnableExactTimeRendering = true to prevent appointments to falsely be displayed as collisions.

Our problem is that appointments with short durations (0-4 minutes) are totally invisible in the WinForms Scheduler. In the ASP.NET scheduler all appointments are visible. An appointment with no duration (0 minutes) is shown as 30min appointment in ASP.NET while 1-minute appointments are shown as a thin line which is ok as we use tooltips for all appointments.

How can we make all appointments visible in WinForms and still use EnableExactTimeRendering? Of course, the rendering will not be exact for small durations but that is better than not showing the appointments at all. We would like to set a minimum size for appointments.

Best regards,
Daniel Gidlöf

 

Completed
Last Updated: 17 Dec 2018 16:35 by Dimitar
To reproduce:  

1.Change the first day of week to Monday:

            SchedulerMonthView view = new SchedulerMonthView();
            CultureInfo ci = new CultureInfo("en-US");
 
            ci.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;
            view.CurrentCulture = ci;
            this.radScheduler1.ActiveView = view;
2. Create an appointment with a recurrence rule illustrated in the attached screenshot. Imagine that today is Wednesday and the recurrence rule starts on Monday from the same week.
As a result, you will notice that the WeeklyRecurrenceRule.FirstDayOfWeek is not set and the appointment occurs on the wrong Sundays. Refer to the attached screenshot. 

Workaround:

        private void radScheduler1_AppointmentAdded(object sender, AppointmentAddedEventArgs e)
        {
            if (e.Appointment.RecurrenceRule != null)
            {
                WeeklyRecurrenceRule r = e.Appointment.RecurrenceRule as WeeklyRecurrenceRule;
                r.FirstDayOfWeek = DayOfWeek.Monday;
            }
        }
Completed
Last Updated: 03 Dec 2018 17:21 by Dimitar
How to reproduce: check the attached (video radscheduler-selection-incorrect.gif)
 public RadForm1()
 {
     InitializeComponent();

     Appointment appointment = new Appointment(DateTime.Today.AddHours(13), TimeSpan.FromHours(1), "Test Appointment");
     this.radScheduler1.Appointments.Add(appointment);

     for (int i = 0; i < 25; i++)
     {
         appointment = new Appointment(DateTime.Today.AddHours(24), TimeSpan.FromHours(1), "AllDay: " + i);
         appointment.AllDay = true;
         this.radScheduler1.Appointments.Add(appointment);
     }
     this.radScheduler1.AllowAppointmentsMultiSelect = true;
 }

Workaround: create a custom input behavior

this.radScheduler1.SchedulerInputBehavior = new CustomSchedulerInputBehavior(this.radScheduler1);

public class CustomSchedulerInputBehavior : SchedulerInputBehavior
{
    public CustomSchedulerInputBehavior(RadScheduler scheduler) 
        : base(scheduler)
    {
    }

    public override bool HandleMouseWheel(MouseEventArgs args)
    {
        if (!this.Scheduler.AllowMouseWheelSupport)
            return false;

        bool scrolled = false;

        if (this.Scheduler.SelectionBehavior.IsAllDayAreaSelection || this.IsLastSelectedAppointmentAllDay(this.Scheduler.SelectionBehavior.SelectedAppointments))
        {
            if (this.Scheduler.GroupType == GroupType.Resource)
            {
                SchedulerDayViewGroupedByResourceElement grouped = this.Scheduler.ViewElement as SchedulerDayViewGroupedByResourceElement;
                IList<SchedulerDayViewElement> childViews = grouped != null ? grouped.GetChildViewElements() : null;
                if (childViews != null && childViews.Count > 0)
                {
                    RadScrollBarElement scroll = childViews[childViews.Count - 1].AllDayHeaderElement.ScrollBar;
                    if (scroll.Visibility != ElementVisibility.Collapsed)
                    {
                        int newValue = scroll.Value - childViews[childViews.Count - 1].AllDayHeaderElement.HeaderHeight * Math.Sign(args.Delta);
                        newValue = Math.Max(Math.Min(newValue, scroll.Maximum - scroll.LargeChange + 1), scroll.Minimum);
                        scroll.Value = newValue;
                        scrolled = true;
                    }
                }
            }
            else
            {
                SchedulerDayViewElement dayView = this.Scheduler.ViewElement as SchedulerDayViewElement;
                RadScrollBarElement scroll = dayView != null ? dayView.AllDayHeaderElement.ScrollBar : null;

                if (scroll != null && scroll.Visibility != ElementVisibility.Collapsed)
                {
                    int newValue = scroll.Value - dayView.AllDayHeaderElement.HeaderHeight * Math.Sign(args.Delta);
                    newValue = Math.Max(Math.Min(newValue, scroll.Maximum - scroll.LargeChange + 1), scroll.Minimum);
                    scroll.Value = newValue;
                    scrolled = true;
                }
            }
        }

        if (scrolled)
        {
            return false;
        }

        if (args.Delta > 0)
        {
            this.Scheduler.ViewElement.Scroll(true);
        }
        else
        {
            this.Scheduler.ViewElement.Scroll(false);
        }
        return false;
    }

    private bool IsLastSelectedAppointmentAllDay(ReadOnlyCollection<IEvent> selectedAppointments)
    {
        if (selectedAppointments.Count > 0)
        {
            return selectedAppointments[selectedAppointments.Count - 1].AllDay;
        }

        return false;
    }

}

Completed
Last Updated: 07 Sep 2018 14:52 by Dimitar
Completed
Last Updated: 03 Sep 2018 06:38 by Dimitar
Workaround: create a custom Appointment and override the PaintRecurrenceIcon method

Public Class MyAppointmentElement
    Inherits AppointmentElement

    Public Sub New(scheduler As RadScheduler, view As SchedulerView, appointment As IEvent)
        MyBase.New(scheduler, view, appointment)
    End Sub

    Public Overrides Sub PaintRecurrenceIcon(graphics As IGraphics)

        If Not Me.Recurring Then
            Return
        End If

        Dim icon As Image = DirectCast(GetType(AppointmentElement).GetMethod("GetRecurrenceIcon", BindingFlags.Instance Or BindingFlags.NonPublic).Invoke(Me, Nothing), Image)

        If icon Is Nothing Then
            Return
        End If

        SyncLock icon
            Dim clientRect As RectangleF = Me.GetClientRectangle(Me.Bounds.Size)
            Dim x As Integer = CInt(clientRect.X) + CInt(clientRect.Width) - icon.Width

            If Me.RightToLeft Then
                x = CInt(clientRect.X)
            End If

            Dim imageRect As Rectangle = New Rectangle(x, CInt(clientRect.Y) + CInt(clientRect.Height) - icon.Height, icon.Width, icon.Height)
            graphics.DrawImage(imageRect, icon, ContentAlignment.TopLeft, True)
        End SyncLock
    End Sub
End Class

Public Class MyElementProvider
    Inherits SchedulerElementProvider
    Public Sub New(scheduler As RadScheduler)
        MyBase.New(scheduler)
    End Sub
    Protected Overrides Function CreateElement(Of T As SchedulerVisualElement)(view As SchedulerView, context As Object) As T
        If GetType(T) = GetType(AppointmentElement) Then
            Return TryCast(New MyAppointmentElement(Me.Scheduler, view, DirectCast(context, IEvent)), T)
        End If
        Return MyBase.CreateElement(Of T)(view, context)
    End Function
End Class