I am working in a web scheduling application which uses DayPilot component
I started by reading the documentation and use the calendar control. but whenever I do some thing which (fires an event on the Daypilot control) I face with following error
An exception was thrown in the server-side event handler:
System.InvalidCastException: Instance Of JasonData doesn't hold a double
at DayPilot.Jason.JasonData.op_Explicit(JasonData data)
at DayPilot.Web.Ui.Events.EventMoveEventArgs..ctor(JasonData parameters, string[] fields, JasonData data)
at DayPilot.Web.Ui.DayPilotCalendar.ExecuteEventJASON(String ea)
at DayPilot.Web.Ui.DayPilotCalendar.System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(string ea)
at System.Web.UI.Page.PrepareCallback(String callbackControlID)
here is the completed code in the ASPX page
<DayPilot:DayPilotCalendar ID="DayPilotCalendar1" runat="server"
Direction="RTL" Days="7"
DataStartField="eventstart" DataEndField="eventend" DataTextField="name"
DataValueField="id" DataTagFields="State"
EventMoveHandling="CallBack"
OnEventMove="DayPilotCalendar1_EventMove"
EventEditHandling="CallBack" OnEventEdit="DayPilotCalendar1_EventEdit" EventClickHandling="Edit" OnBeforeEventRender="DayPilotCalendar1_BeforeEventRender" EventResizeHandling="CallBack" OnEventResize="DayPilotCalendar1_EventResize" EventDoubleClickHandling="CallBack" OnEventDoubleClick="DayPilotCalendar1_EventDoubleClick" oncommand="DayPilotCalendar1_Command"
and here is the complete codebehind
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
Initialization();
}
private void dbUpdateEvent(string id, DateTime start, DateTime end)
{ // update for move
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
{
con.Open();
SqlCommand cmd = new SqlCommand("UPDATE [event] SET [eventstart] = @start, [eventend] = @end WHERE [id] = @id", con);
cmd.Parameters.AddWithValue("id", id);
cmd.Parameters.AddWithValue("start", start);
cmd.Parameters.AddWithValue("end", end);
cmd.ExecuteNonQuery();
}
}
private DataTable dbGetEvents(DateTime start, int days)
{ // get Data
SqlDataAdapter da = new SqlDataAdapter("SELECT [id], [name], [eventstart], [eventend], [state], [other] FROM [event] WHERE NOT (([eventend] <= @start) OR ([eventstart] >= @end))", ConfigurationManager.ConnectionStrings["DayPilotTest"].ConnectionString); ;
da.SelectCommand.Parameters.AddWithValue("start", start);
da.SelectCommand.Parameters.AddWithValue("end", start.AddDays(days));
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
protected void DayPilotCalendar1_EventMove(object sender, DayPilot.Web.Ui.Events.EventMoveEventArgs e)
{ // Drag and Drop
dbUpdateEvent(e.Value, e.NewStart, e.NewEnd);
DayPilotCalendar1.DataSource = dbGetEvents(DayPilotCalendar1.StartDate, DayPilotCalendar1.Days);
DayPilotCalendar1.DataBind();
DayPilotCalendar1.Update();
}
private void Initialization()
{ // first bind
DayPilotCalendar1.StartDate = DayPilot.Utils.Week.FirstDayOfWeek(new DateTime(2009, 1, 1));
DayPilotCalendar1.DataSource = dbGetEvents(DayPilotCalendar1.StartDate, DayPilotCalendar1.Days);
DataBind();
}
protected void DayPilotCalendar1_BeforeEventRender(object sender, BeforeEventRenderEventArgs e)
{ // change the color based on state
if (e.Tag["State"] == "Fixed")
{
e.DurationBarColor = "Brown";
}
}
protected void DayPilotCalendar1_EventResize(object sender, DayPilot.Web.Ui.Events.EventResizeEventArgs e)
{
dbUpdateEvent(e.Value, e.NewStart, e.NewEnd);
DayPilotCalendar1.DataSource = dbGetEvents(DayPilotCalendar1.StartDate, DayPilotCalendar1.Days);
DayPilotCalendar1.DataBind();
DayPilotCalendar1.Update();
}
protected void DayPilotCalendar1_EventDoubleClick(object sender, EventClickEventArgs e)
{
dbInsertEvent(e.Text , e.Start, e.End, "New", "New Meeting");
DayPilotCalendar1.DataSource = dbGetEvents(DayPilotCalendar1.StartDate, DayPilotCalendar1.Days);
DayPilotCalendar1.DataBind();
DayPilotCalendar1.Update();
}
note that I remove unnecessary code behinds