Limit the number of concurrent appointments just for a single resource

8 posts, 0 answers
  1. Martin Gartmann
    Martin Gartmann avatar
    51 posts
    Member since:
    Apr 2004

    Posted 14 Jun 2011 Link to this post

    Hi All,

    1.) i want to implement a simlar function like this one shown by Telerik in the past for the asp.net ajax scheduler to my winform application. I use it on a webform solutions and it is working great.

    http://www.telerik.com/support/kb/aspnet-ajax/scheduler/limit-the-number-of-concurrent-appointments-just-for-a-single-resource.aspx

    Is there a sample around how to do the same in winforms.

    2.) in my winform application the times in the scheduler is 24h format and language is set to german, but when i enter  edit mode AM/PM Times are shown in the time pickers. any suggestions what might be wrong.

    Kind regards

    Martin Gartmann
  2. Ivan Todorov
    Admin
    Ivan Todorov avatar
    688 posts

    Posted 15 Jun 2011 Link to this post

    Hello Martin,

    The first of your requirements can be achieved by subscribing to the CollectionChanging event of the Appointments collection of RadScheduler and canceling the process of adding an appointment as needed. This is shown in the next code snippet:
    private const int MaxConcurentAppointments = 1;
     
    private int GetConcurentAppointments(Appointment newAppointment)
    {
        int count = 1;
        foreach (Appointment app in this.radScheduler1.Appointments)
        {
            if (app.ResourceId == newAppointment.ResourceId &&
                app.Start < newAppointment.End &&
                app.End > newAppointment.Start)
            {
                count++;
            }
        }
     
        return count;
    }
     
    void Appointments_CollectionChanging(object sender, Telerik.WinControls.Data.NotifyCollectionChangingEventArgs e)
    {
        if (e.Action == Telerik.WinControls.Data.NotifyCollectionChangedAction.Add)
        {
            foreach (Appointment app in e.NewItems)
            {
                if (GetConcurentAppointments(app) > MaxConcurentAppointments)
                {
                    e.Cancel = true;
                    break;
                }
            }
        }
    }

    The second of your requirements could be achieved by inheriting from the AppointmentEditDialog class and changing the format of the time pickers:
    public class CustomEditAppointmentDialog : EditAppointmentDialog
    {
        public CustomEditAppointmentDialog() : base()
        {
            InitializeComponent();
            this.timeStart.CustomFormat = "HH:mm:ss";
            this.timeEnd.CustomFormat = "HH:mm:ss";
        }
    }

    and replacing the standard dialog by handling the AppointmentEditDialogShowing event:
    void radScheduler1_AppointmentEditDialogShowing(object sender, AppointmentEditDialogShowingEventArgs e)
    {
        e.AppointmentEditDialog = new CustomEditAppointmentDialog();
    }

    I hope you find this useful. Feel free to ask if you have any further questions.

    All the best,
    Ivan Todorov
    the Telerik team
    Q1’11 SP1 of RadControls for WinForms is available for download; also available is the Q2'11 Roadmap for Telerik Windows Forms controls.
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Martin Gartmann
    Martin Gartmann avatar
    51 posts
    Member since:
    Apr 2004

    Posted 17 Jun 2011 Link to this post

    Dear Ivan,
    the 2nd solutions is working like expected, but after converting your code to vb.net i will se an error.

    Private Function GetConcurentAppointments(ByVal newAppointment As Appointment) As Integer
        Dim count As Integer = 1
        For Each app As Appointment In Me.rsMain.Appointments
            If ((app.ResourceId = newAppointment.ResourceId) _
                        AndAlso ((app.Start < newAppointment.End) _
                        AndAlso (app.End > newAppointment.Start))) Then
                count = (count + 1)
            End If
        Next
        Return count
    End Function

    at  app.ResourceId = newAppointment.ResourceId there is an error code: 

    The =-Operator is not declared for the type "Telerik.WinControls.UI.EventId"
    and "Telerik.WinControls.UI.EventId"

    I have an extended appointment class like this


    Imports Telerik.WinControls.UI
     
    Public Class AppointmentWithKPP
     
        Inherits Appointment
        Public Sub New()
            MyBase.New()
        End Sub
     
        Private _KundenId As Integer
        Private _Preis As String = String.Empty
        Private _Personen As String = String.Empty
     
        Public Property KundenId() As Integer
            Get
                Return Me._KundenId
            End Get
            Set(ByVal value As Integer)
                If Me._KundenId <> value Then
                    Me._KundenId = value
                    Me.OnPropertyChanged("KundenId")
                End If
            End Set
        End Property
     
        Public Property Preis() As String
            Get
                Return Me._Preis
            End Get
            Set(ByVal value As String)
                If Me._Preis <> value Then
                    Me._Preis = value
                    Me.OnPropertyChanged("Preis")
                End If
            End Set
        End Property
     
     
        Public Property Personen() As String
            Get
                Return Me._Personen
            End Get
            Set(ByVal value As String)
                If Me._Personen <> value Then
                    Me._Personen = value
                    Me.OnPropertyChanged("Personen")
                End If
            End Set
        End Property
     
     
    End Class

    Any suggestions what's the reason ?

    Kind regards

    Martin
  5. Ivan Todorov
    Admin
    Ivan Todorov avatar
    688 posts

    Posted 22 Jun 2011 Link to this post

    Hi Martin Gartmann,

    It looks like the equality check has not converted correctly. Please replace the following line:

    If ((app.ResourceId = newAppointment.ResourceId) _
    with this one:
    If (Object.Equals(app.ResourceId, newAppointment.ResourceId) _

    Hope this helps. Should you have any additional questions, do not hesitate to ask.

    Kind regards,
    Ivan Todorov
    the Telerik team
    Q1’11 SP1 of RadControls for WinForms is available for download; also available is the Q2'11 Roadmap for Telerik Windows Forms controls.
  6. Martin Gartmann
    Martin Gartmann avatar
    51 posts
    Member since:
    Apr 2004

    Posted 27 Jun 2011 Link to this post

    Dear Ivan,
    Your suggestion solved this issue.
    I have used

    AddHandler Me.rsMain.Appointments.CollectionChanging, AddressOf Appointments_CollectionChanging

    to subscribe to the CollectionChanging and it is working like expected when i add a new appoitment.

    Private Sub Appointments_CollectionChanging(ByVal sender As Object, ByVal e As Telerik.WinControls.Data.NotifyCollectionChangingEventArgs)
          If (e.Action = Telerik.WinControls.Data.NotifyCollectionChangedAction.Add) Then
              For Each app As Appointment In e.NewItems
                  If (GetConcurentAppointments(app) > MaxConcurentAppointments) Then
                      e.Cancel = True
                      MsgBox("Der Zeitraum ist bereits belegt!" + vbCrLf + vbCrLf + "Mehrfachbelegung ist nicht erlaubt!")
                      Exit For
                  End If
              Next
          End If
      End Sub

    When i Drag&Drop or Resize an appoinment in the scheduler a collectioinchanging seems not to be fired.

    Add and remove will fire it.

    As far as i understood this should also be also the case when a change an appointment.

    Finally: What i want is to block overlapping by dragging and dropping (moving) or resizing an appointment.

    Can this be done also just by Appointments_CollectionChanging ?

    or must i use DragDropBehavior.AppointmentMoving or another type of event.

    Kind regards

    Martin Gartmann





  7. Ivan Todorov
    Admin
    Ivan Todorov avatar
    688 posts

    Posted 30 Jun 2011 Link to this post

    Hi Martin,

    CollectionChanging event will not fire in your case, because the Appointment class does not implement INotifyPropertyChanging, hence the collection is not notified for such event. You should use DragDropBehavior.AppointmentDropping and ResizeBehavior.AppointmentResizing events.
    Private Sub ResizeBehavior_AppointmentResizing(sender As Object, e As AppointmentResizingEventArgs)
        If Not IsResizeValid(e.Appointment, Control.MousePosition) Then
            e.Cancel = True
        End If
    End Sub
     
    Private Sub DragDropBehavior_AppointmentDropping(sender As Object, e As AppointmentMovingEventArgs)
        If GetConcurrentAppointments(e.Appointment) > 1 Then
            e.Cancel = True
        End If
    End Sub
     
    Private Function GetConcurrentAppointments(newAppointment As IEvent) As Integer
        Dim count As Integer = 1
        For Each app As Appointment In Me.radScheduler1.Appointments
            If Object.Equals(app.ResourceId, newAppointment.ResourceId) AndAlso app.Start < newAppointment.[End] AndAlso app.[End] > newAppointment.Start AndAlso app <> Me.radScheduler1.SchedulerElement.DragDropBehavior.ActiveFeedback.AssociatedAppointment Then
                count += 1
            End If
        Next
        Return count
    End Function
     
    Private Function IsResizeValid(resizedApp As IEvent, mousePos As Point) As Boolean
     
        Dim clientPoint As Point = Me.radScheduler1.PointToClient(mousePos)
     
        Dim appElement As AppointmentElement = Me.radScheduler1.SchedulerElement.ResizeBehavior.ActiveAppointment
     
        If appElement Is Nothing Then
            Return True
        End If
     
        Dim isUpResize As Boolean = Math.Abs(clientPoint.Y - appElement.ControlBoundingRectangle.Top) < Math.Abs(clientPoint.Y - appElement.ControlBoundingRectangle.Bottom)
     
        For Each app As Appointment In Me.radScheduler1.Appointments
            If Not Object.Equals(app, resizedApp) Then
                If app.[End] = resizedApp.Start AndAlso isUpResize Then
                    Return False
                End If
                If app.Start = resizedApp.[End] AndAlso Not isUpResize Then
                    Return False
                End If
            End If
        Next
        Return True
    End Function

    Please note that this will only work when grouping by resource is disabled. There are some known limitations when grouping by resource is turned on (for example: one is not able to cancel the dropping of an appointment) which we plan to address in one of the future releases.

    I hope this helps. Do not hesitate to contact me if you have any additional questions.

    Regards,
    Ivan Todorov
    the Telerik team
    Registration for Q2 2011 What’s New Webinar Week is now open. Mark your calendar for the week starting July 18th and book your seat for a walk through all the exciting stuff we ship with the new release!
  8. Martin Gartmann
    Martin Gartmann avatar
    51 posts
    Member since:
    Apr 2004

    Posted 30 Jun 2011 Link to this post

    Dear Ivan,

    Thanks for helping with this issue. After adding:

    AddHandler Me.rsMain.SchedulerElement.ResizeBehavior.AppointmentResizing, AddressOf ResizeBehavior_AppointmentResizing
    AddHandler Me.rsMain.SchedulerElement.DragDropBehavior.AppointmentDropping, AddressOf DragDropBehavior_AppointmentDropping

    in my form_load without grouping active it is working like expected. Is there a detail timetable when this option will be also avaible when grouping is switched on, because i plan to use it.

    My application will be just used for training/demo purpose in the next weeks and during this time this feature is not really needed.

    It should go to in production beginning of 2012, so if this option will be avaible until 2011 Q3 i would implement this later while working on other features.

    So information about the timetable would be helpfull

    Kind regards

    Martin

    P.S.: I will submit my code as an example in the support resources when ready, because i guess this might be helpfull for other users running into near by questions.
  9. Ivan Todorov
    Admin
    Ivan Todorov avatar
    688 posts

    Posted 05 Jul 2011 Link to this post

    Hi Martin,

    Currently, we have not specified any time frame for this issue. The issue is logged in PITS, so you can subscribe and vote for it. Here is the link to the PITS item. If more people vote for it, we will consider addressing it with higher priority.

    I hope this helps. Feel free to ask if you have any further questions.

    All the best,
    Ivan Todorov
    the Telerik team
    Registration for Q2 2011 What’s New Webinar Week is now open. Mark your calendar for the week starting July 18th and book your seat for a walk through all the exciting stuff we ship with the new release!
Back to Top
UI for WinForms is Visual Studio 2017 Ready