Martin Gartmann
Top achievements
Rank 2
Martin Gartmann
asked on 14 Jun 2011, 02:33 PM
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
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
7 Answers, 1 is accepted
0
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:
The second of your requirements could be achieved by inheriting from the AppointmentEditDialog class and changing the format of the time pickers:
and replacing the standard dialog by handling the AppointmentEditDialogShowing event:
I hope you find this useful. Feel free to ask if you have any further questions.
All the best,
Ivan Todorov
the Telerik team
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
0
Martin Gartmann
Top achievements
Rank 2
answered on 17 Jun 2011, 08:10 AM
Dear Ivan,
the 2nd solutions is working like expected, but after converting your code to vb.net i will se an error.
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
Any suggestions what's the reason ?
Kind regards
Martin
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 countEnd Functionat 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.UIPublic 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 PropertyEnd ClassAny suggestions what's the reason ?
Kind regards
Martin
0
Hi Martin Gartmann,
It looks like the equality check has not converted correctly. Please replace the following line:
with this one:
Hope this helps. Should you have any additional questions, do not hesitate to ask.
Kind regards,
Ivan Todorov
the Telerik team
It looks like the equality check has not converted correctly. Please replace the following line:
If ((app.ResourceId = newAppointment.ResourceId) _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
0
Martin Gartmann
Top achievements
Rank 2
answered on 27 Jun 2011, 03:43 PM
Dear Ivan,
Your suggestion solved this issue.
I have used
to subscribe to the CollectionChanging and it is working like expected when i add a new appoitment.
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
or must i use DragDropBehavior.AppointmentMoving or another type of event.
Kind regards
Martin Gartmann
Your suggestion solved this issue.
I have used
AddHandler Me.rsMain.Appointments.CollectionChanging, AddressOf Appointments_CollectionChangingto 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 SubWhen 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
0
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.
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
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 IfEnd SubPrivate Sub DragDropBehavior_AppointmentDropping(sender As Object, e As AppointmentMovingEventArgs) If GetConcurrentAppointments(e.Appointment) > 1 Then e.Cancel = True End IfEnd SubPrivate 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 countEnd FunctionPrivate 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 TrueEnd FunctionPlease 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!
0
Martin Gartmann
Top achievements
Rank 2
answered on 30 Jun 2011, 02:52 PM
Dear Ivan,
Thanks for helping with this issue. After adding:
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.
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_AppointmentDroppingin 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.
0
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
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!