Hello,
I am having this same issue and the solution below was unfortunately not a helpful answer. I have spent so many hours on this I have lost count.
When dragging and dropping an appointment, the AppointmentUpdate Server event has the same value for the event args for the e.Appointment AND e.ModifiedAppointment. When I add the client event OnClientAppointmentMoveEnd, I get the correct modified value on the client side, but the serverside is always wrong.
[.net 2.0 + Q3 2009 with hotfix]
Thanks for the help,
Ryan (Code Below)
Server Code: (values for e.Appointment and e.ModifiedAppointment are the same)
Client Code:
I am having this same issue and the solution below was unfortunately not a helpful answer. I have spent so many hours on this I have lost count.
When dragging and dropping an appointment, the AppointmentUpdate Server event has the same value for the event args for the e.Appointment AND e.ModifiedAppointment. When I add the client event OnClientAppointmentMoveEnd, I get the correct modified value on the client side, but the serverside is always wrong.
[.net 2.0 + Q3 2009 with hotfix]
Thanks for the help,
Ryan (Code Below)
Server Code: (values for e.Appointment and e.ModifiedAppointment are the same)
| protected void CalendarRadScheduler_AppointmentUpdate(object sender, AppointmentUpdateEventArgs e) |
| { |
| if (e.Appointment.Start != e.ModifiedAppointment.Start) |
| { |
| Appointment objModApt = e.ModifiedAppointment; |
| //load message from database |
| MessageDAO daoMessage = new MessageDAO(); |
| MessageDTO dtoMessage = daoMessage.GetById((int)objModApt.ID); |
| //update message with new time |
| dtoMessage.Start = objModApt.Start; |
| dtoMessage.End = objModApt.Start.AddMinutes(10); |
| //Save updated message to database |
| dtoMessage.Method = CoreToolkit.ObjectMethod.Modify; |
| daoMessage.Save(dtoMessage); |
| } |
| else |
| { |
| e.Cancel = true; |
| } |
| } |
Client Code:
| <%@ Control Language="C#" AutoEventWireup="true" Codebehind="MyUserControl.ascx.cs" |
| Inherits="UserControls.MyUserControl" %> |
| <meta http-equiv="X-UA-Compatible" content="IE=7"/> |
| <pro:RadCodeBlock ID="RadCodeBlock1" runat="server"> |
| <script type="text/javascript"> function OnClientAppointmentMoveEnd(sender, eventArgs) { alert("New start time: " + eventArgs.get_newStartTime()); } |
| function formatDate(date) |
| { |
| var year = padNumber(date.getFullYear(), 4); |
| var month = padNumber(date.getMonth() + 1, 2); |
| var day = padNumber(date.getDate(), 2); |
| var hour = padNumber(date.getHours(), 2); |
| var minute = padNumber(date.getMinutes(), 2); |
| return year + month + day + hour + minute; |
| } |
| function padNumber(number, totalDigits) |
| { |
| numbernumbernumber = number.toString(); |
| var padding = ''; |
| if (totalDigits > number.length) |
| { |
| for (i = 0; i < (totalDigits - number.length); i++) |
| { |
| padding += '0'; |
| } |
| } |
| return padding + number.toString(); |
| } |
| //prevent resizing |
| function OnClientAppointmentResizeStart(sender, eventArgs) |
| { |
| alert('no resizing'); |
| //eventArgs.set_cancel(true); |
| } |
| //prevent resizing |
| function OnClientAppointmentResizeEnd(sender, eventArgs) |
| { |
| alert('resizing end') |
| } |
| //prevent editing of recurring messages |
| function OnClientAppointmentEditing(sender, eventArgs) |
| { |
| alert('editing'); |
| if(eventArgs.get_editingRecurringSeries()) |
| eventArgs.set_cancel(true); |
| } |
| function OnClientAppointmentDoubleClick(sender, eventArgs) |
| { |
| alert('here'); |
| } |
| function OnClientAppointmentInserting(sender, eventArgs) |
| { |
| var start = formatDate(eventArgs.get_startTime()); |
| document.location.href = '<%=PageToRedirect + "?StartDate="%>' + start; |
| eventArgs.set_cancel(true); |
| } |
| </script> |
| </pro:RadCodeBlock> |
| <telerik:RadScriptBlock runat="server" ID="scriptContextMenu"> |
| <script type="text/javascript"> |
| var selectedAppointment = null; |
| var contextMenuSlot = null; |
| function checkResourceMenuItem(menu, appointment) { |
| var calendar = appointment.get_resources().getResourcesByType("Calendar").getResource(0); |
| if (!calendar) |
| return; |
| var actionItem = menu.findItemByText("Action"); |
| //Traverse all menu items below "Action" |
| for (var i = 0; i < actionItem.get_items().get_count(); i++) { |
| var item = actionItem.get_items().getItem(i); |
| if (item.get_value() == calendar.get_key()) { |
| //The item corresponds to the current "Calendar" - the Value of the item stores the Key of the resource |
| item.set_imageUrl("Images/checked.gif"); |
| } |
| else { |
| item.set_imageUrl(""); |
| } |
| } |
| } |
| //Called when the user right-clicks an appointment |
| function appointmentContextMenu(sender, eventArgs) { |
| var menu = $find("<%= SchedulerAppointmentContextMenu.ClientID %>"); |
| selectedAppointment = eventArgs.get_appointment(); |
| checkResourceMenuItem(menu, selectedAppointment); |
| menu.show(eventArgs.get_domEvent()); |
| } |
| //Called when the user clicks an item from the appointment context menu |
| function appointmentContextMenuItemClicking(sender, eventArgs) { |
| var clickedItem = eventArgs.get_item(); |
| if (clickedItem.get_text() == "Action") { |
| //Prevent the menu from closing if the user clicked the "Action" menu item |
| eventArgs.set_cancel(true); |
| return; |
| } |
| } |
| //Called when the user clicks an item from the appointment context menu |
| function appointmentContextMenuItemClicked(sender, eventArgs) |
| { |
| if (!selectedAppointment) |
| return; |
| var clickedItem = eventArgs.get_item(); |
| var scheduler = $find("<%= CalendarRadScheduler.ClientID %>"); |
| if (clickedItem.get_parent().get_text && clickedItem.get_parent().get_text() == "Action") { |
| //The user clicked the item corresponding to the "Calendar" resource to which the appointment is assigned |
| if (clickedItem.get_imageUrl()) |
| return; |
| //Clear all resources |
| selectedAppointment.get_resources().clear(); |
| //Find the resource corresponding to the clicked item |
| var calendar = scheduler.get_resources().getResourceByTypeAndKey("Calendar", clickedItem.get_value()); |
| //Add it to the appointment resources collection |
| selectedAppointment.get_resources().add(calendar); |
| //Update the appointment |
| scheduler.updateAppointment(selectedAppointment); |
| } |
| } |
| function OnClientRecurrenceActionDialogShowing(sender, eventArgs) |
| { |
| alert('in OnClientRecurrenceActionDialogShowing()'); |
| eventArgs.set_cancel(true); |
| //Edit this instance only: |
| eventArgs.set_editSeries(false); |
| } |
| function CalendarRadScheduler_AppointmentContextMenuItemClicked(sender, eventArgs) |
| { |
| alert('you click a menu button'); |
| } |
| function OnClientNavigationCommand(sender, eventArgs) |
| { |
| alert('Navigation Command:'); |
| alert(eventArgs.get_selectedDate().toString()); |
| } |
| </script> |
| </telerik:RadScriptBlock> |
| <pro:RadAjaxManager ID="RadAjaxManager1" EnableAJAX="true" runat="server" OnAjaxRequest="RadAjaxManager1_AjaxRequest"> |
| <AjaxSettings> |
| <pro:AjaxSetting AjaxControlID="CalendarRadScheduler"> |
| <UpdatedControls> |
| <telerik:AjaxUpdatedControl ControlID="CalendarRadScheduler" LoadingPanelID="RadAjaxLoadingPanel1" /> |
| </UpdatedControls> |
| </pro:AjaxSetting> |
| </AjaxSettings> |
| </pro:RadAjaxManager> |
| <pro:RadScheduler |
| ID="CalendarRadScheduler" |
| runat="server" |
| EnableAjaxSkinRendering="false" |
| Height="750px" |
| Width="578px" |
| ShowAllDayRow="False" |
| AllowDelete="True" |
| AllowEdit="True" |
| AllowInsert="True" |
| Skin="Office2007" |
| HoursPanelTimeFormat="h:mm tt" |
| MinutesPerRow="15" |
| ShowFullTime="True" |
| StartEditingInAdvancedForm="false" |
| DataKeyField="ID" |
| DataSubjectField="Subject" |
| DataStartField="Start" |
| DataEndField="End" |
| DataRecurrenceField="RecurrenceRule" |
| DataRecurrenceParentKeyField="RecurrenceParentID" |
| DayEndTime="18:30:00" |
| DayStartTime="08:00:00" |
| ShowFooter="false" |
| OnClientAppointmentInserting="OnClientAppointmentInserting" |
| OnClientAppointmentDoubleClick="OnClientAppointmentDoubleClick" |
| OnClientAppointmentEditing="OnClientAppointmentEditing" |
| OnClientAppointmentResizeEnd="OnClientAppointmentResizeEnd" |
| OnAppointmentCreated="CalendarRadScheduler_AppointmentCreated" |
| OnAppointmentDataBound="CalendarRadScheduler_AppointmentDataBound" |
| CustomAttributeNames="NetworkId" |
| OnAppointmentCommand="CalendarRadScheduler_AppointmentCommand" |
| OnFormCreating="CalendarRadScheduler_FormCreating" |
| OnAppointmentContextMenuItemClicked="CalendarRadScheduler_AppointmentContextMenuItemClicked" |
| OnAppointmentUpdate="CalendarRadScheduler_AppointmentUpdate" |
| OnClientRecurrenceActionDialogShowing ="OnClientRecurrenceActionDialogShowing" |
| OnClientNavigationCommand="OnClientNavigationCommand" OnClientAppointmentMoveEnd="OnClientAppointmentMoveEnd" |
| OnNavigationCommand="CalendarRadScheduler_NavigationCommand"> |
| <AppointmentContextMenus> |
| <%--The appointment context menu interaction is handled on the client in this example--%> |
| <%--See the JavaScript code above--%> |
| <telerik:RadSchedulerContextMenu runat="server" ID="SchedulerAppointmentContextMenu"> |
| <Items> |
| <telerik:RadMenuItem Text="View" Value="CommandView" /> |
| <telerik:RadMenuItem IsSeparator="True" /> |
| <telerik:RadMenuItem Text="Copy" Value="CommandCopy" ImageUrl="/images/copy.gif"/> |
| <telerik:RadMenuItem IsSeparator="True" /> |
| <telerik:RadMenuItem Text="Edit" Value="CommandEdit" ImageUrl="/images/edit.gif"/> |
| <telerik:RadMenuItem IsSeparator="True" /> |
| <telerik:RadMenuItem Text="Delete" Value="CommandDelete" ImageUrl="/images/icon_trash.gif" /> |
| <telerik:RadMenuItem IsSeparator="True" /> |
| <telerik:RadMenuItem Text="Action" Visible="false"> |
| <Items> |
| <telerik:RadMenuItem Text="Development" Value="1" /> |
| <telerik:RadMenuItem Text="Marketing" Value="2" /> |
| <telerik:RadMenuItem Text="Personal" Value="3" /> |
| <telerik:RadMenuItem Text="Work" Value="4" /> |
| </Items> |
| </telerik:RadMenuItem> |
| </Items> |
| </telerik:RadSchedulerContextMenu> |
| </AppointmentContextMenus> |
| <AppointmentTemplate> |
| <div> |
| <%# FormatCalendarMessage() %> |
| </div> |
| </AppointmentTemplate> |
| </pro:RadScheduler> |
| <asp:Label ID="lbl" runat="server" Visible="false"></asp:Label> |
| <pro:RadAjaxLoadingPanel |
| ID="RadAjaxLoadingPanel1" |
| runat="server" |
| Transparency="30" |
| BackColor="#E0E0E0" |
| InitialDelayTime="500"> |
| <asp:Image ID="Image2" Style="margin-top: 200px" runat="server" ImageUrl="/images/loading.gif" BorderWidth="0px" AlternateText="Loading"></asp:Image> |
| </pro:RadAjaxLoadingPanel> |