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 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
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_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
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
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!
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!