JavaScript
JavaScript Example (adding a single event)
See also:
This method can be called before .init() or after .init(). Since build 8.1.1916 the UI update is postponed - this means multiple events.add() calls (even after .init()) will cause just one UI update.
var e = new DayPilot.Event({
start: new DayPilot.Date("2013-03-25T00:00:00"),
end: new DayPilot.Date("2013-03-27T00:00:00"),
id: DayPilot.guid(),
resource: "A",
text: "Event"
});
dp.events.add(e);
JavaScript Example (bulk loading)
See also:
dp.events.list = [
{
start: "2013-03-25T00:00:00",
end: "2013-03-27T00:00:00",
id: "1",
resource: "A",
text: "Event 1"
},
{
start: "2013-03-26T12:00:00",
end: "2013-03-27T00:00:00",
id: "2",
resource: "B",
text: "Event 2"
}
];
dp.update();
Loading Events from a JSON URL
You can use DayPilot.Scheduler.events.load() method to load events from a JSON endpoint.
<div id="dp"></div>
<script type="text/javascript">
var dp = new DayPilot.Scheduler("dp");
dp.startDate = "2014-01-01";
dp.days = 365;
dp.scale = "Day";
dp.timeHeaders = [
{ groupBy: "Month", format: "MMM yyyy" },
{ groupBy: "Cell", format: "ddd d" }
];
dp.init();
dp.events.load("/getEvents");
dp.rows.load("/getResources");
</script>
Unique ID Required
Since version 2018.4.3469 the Scheduler requires all events to have a unique ID ("id" property of the event data object). If you try to load an event which has the same ID as an existing event the Scheduler will throw an exception:
-
Loading an event using DayPilot.Scheduler.events.add(): "The event you are trying to add using DayPilot.Scheduler.events.add() is already loaded. A unique ID is required."
-
Duplicate IDs in DayPilot.Scheduler.events.list: "Duplicate event IDs are not allowed"
The best practice is to have the IDs generated on the server side - either a UUID or a sequential numeric ID generated by the database.
For testing purposes, you can also use DayPilot.guid() method to generate a UUID on the client side. It generates a 128-bit random UUID in hex format (example: "806e6a7d-fd44-5de4-af64-0c167cf381f9"). Note that it doesn't conform to the UUID spec (all bits are random).
Tutorials
Angular
The Angular Scheduler component supports the standard JavaScript API (direct access using the update() method) and also automatic binding using the [events]
attribute of the <daypilot-scheduler>
tag:
import {Component, ViewChild, AfterViewInit} from "@angular/core";
import {DayPilot} from "daypilot-pro-angular";
@Component({
selector: 'scheduler-component',
template: `<daypilot-scheduler [config]="config" [events]="events" #scheduler></daypilot-scheduler>`,
styles: [``]
})
export class SchedulerComponent implements AfterViewInit {
@ViewChild("scheduler") scheduler: DayPilot.Angular.Scheduler;
events: DayPilot.EventData[] = [
{ text: "Event 1", id: "1", resource: "R1", start: "2025-01-03", end: "2025-01-10"}
];
config: DayPilot.SchedulerConfig = {
timeHeaders : [
{groupBy: "Month", format: "MMMM yyyy"},
{groupBy: "Day", format: "d"}
],
eventHeight: 40,
scale: "Day",
treeEnabled: true,
startDate: "2025-01-01",
days: 31,
resources: [
{ name: "Resource 1", id: "R1" }
]
};
constructor() {}
ngAfterViewInit(): void {
}
}
Using the automatic binding using [events]
attribute brings some performance overhead. See also the discussion at Angular Scheduler page.
React
In the React Scheduler, you can load the event data using the events
attribute of the <DayPilotScheduler>
JSX tag.
Usually, the events
attribute points to a state variable that is set during component initialization (using a useEffect()
block with empty dependencies).
import React, { useEffect, useState } from 'react';
import { DayPilot, DayPilotScheduler } from "daypilot-pro-react";
const Scheduler = () => {
const [scheduler, setScheduler] = useState(null);
const [events, setEvents] = useState([]);
const config= {
timeHeaders: [{groupBy: "Hour"}, {groupBy: "Cell", format: "mm"}],
scale: "CellDuration",
cellDuration: 15,
// ...
};
useEffect(() => {
const events = [
{
id: 1,
text: "Event 1",
start: "2025-08-02T10:00:00",
end: "2025-08-02T11:00:00",
},
{
id: 2,
text: "Event 2",
start: "2025-08-05T09:30:00",
end: "2025-08-05T11:30:00",
},
{
id: 3,
text: "Event 3",
start: "2025-08-07T10:30:00",
end: "2025-08-07T13:30:00",
}
];
setEvents(events);
}, []);
return (
<div>
<DayPilotScheduler
{...config}
events={events}
controlRef={setScheduler}
/>
</div>
);
}
export default Scheduler;
ASP.NET WebForms
Load the data in the code behind using DataSource
or DataSourceID
properties.
Let's consider an event
DB table with the following fields:
-
id
-
name
-
start
-
end
-
resource
In order to show the events in the Scheduler you have to do the following steps:
-
Set the
DataSource
property -
Map the column names.
-
Call
DataBind()
.
1. DataSource
After loading a DataTable from a database (or other source) you should assign it to the DayPilotScheduler.DataSource property:
DayPilotScheduler1.DataSource = GetData(DayPilotScheduler1);
GetData() loads the data from a database:
public DataTable GetAssignments(DayPilotScheduler calendar)
{
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [event] WHERE NOT (([end] <= @start) OR ([start] >= @end))", ConfigurationManager.ConnectionStrings["daypilot"].ConnectionString);
da.SelectCommand.Parameters.AddWithValue("start", calendar.StartDate);
da.SelectCommand.Parameters.AddWithValue("end", calendar.EndDate.AddDays(1));
da.Fill(dt);
return dt;
}
When loading the events from a database remember to limit the SELECT so only the necessary events are loaded.
See also
2. Map the Columns/Fields
You need to indicate which columns contain the necessary data:
DayPilotScheduler1.DataStartField = "start";
DayPilotScheduler1.DataEndField = "end";
DayPilotScheduler1.DataTextField = "name";
DayPilotScheduler1.DataIdField = "id";
DayPilotScheduler1.DataResourceField = "resource";
You can also set these properties in the visual designer:
3. DataBind()
Bind the data in the Page_Load() method:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DayPilotScheduler1.DataSource = GetData(DayPilotScheduler1);
DayPilotScheduler1.DataStartField = "start";
DayPilotScheduler1.DataEndField = "end";
DayPilotScheduler1.DataTextField = "name";
DayPilotScheduler1.DataIdField = "id";
DayPilotScheduler1.DataResourceField = "resource";
DayPilotScheduler1.DataBind();
}
}
4. Custom Event Data (Tags)
Define the data source fields that you want to pass with the event in DataTagFields, e.g. DataTagFields="eventtype, background".
There are three places where you can access the information from the tag fields:
-
BeforeEventRender event handler (access it as e.Tag["eventtype"] here and use it to draw custom icons in the event, custom background colors, etc.)
-
Event-related events on the client side, e.g. in EventClickJavaScript (as e.tag("eventtype")).
-
Event-related events on the server side, e.g. in EventClick event handler (as e.Tag["eventtype"]).
ASP.NET MVC
1. Load the data
Let's consider an event
DB table with the following fields:
-
id
-
name
-
start
-
end
-
resource
Load the event data and assign the result to Events property:
public class Dps : DayPilotScheduler
{
protected override void OnInit(InitArgs initArgs)
{
Events = new EventManager().FilteredData(StartDate, StartDate.AddDays(Days)).AsEnumerable();
// ...
}
}
This is a sample EventManager
class:
public class EventManager
{
public DataTable FilteredData(DateTime start, DateTime end)
{
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [event] WHERE NOT (([end] <= @start) OR ([start] >= @end))", ConfigurationManager.ConnectionStrings["daypilot"].ConnectionString);
da.SelectCommand.Parameters.AddWithValue("start", start);
da.SelectCommand.Parameters.AddWithValue("end", end);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
2. Map the Columns/Fields
public class Dps : DayPilotScheduler
{
protected override void OnInit(InitArgs initArgs)
{
Events = new EventManager().FilteredData(StartDate, StartDate.AddDays(Days)).AsEnumerable();
DataStartField = "start";
DataEndField = "end";
DataTextField = "name";
DataIdField = "id";
DataResourceField = "resource";
// ...
}
}
3. Update()
The OnInit()
is invoked using a CallBack and it is necessary to ask the scheduler to redraw the event. You can do this by calling Update()
or UpdateWithMessage()
.
public class Dps : DayPilotScheduler
{
protected override void OnInit(InitArgs initArgs)
{
Events = new EventManager().FilteredData(StartDate, StartDate.AddDays(Days)).AsEnumerable();
DataStartField = "start";
DataEndField = "end";
DataTextField = "name";
DataIdField = "id";
DataResourceField = "resource";
UpdateWithMessage("Welcome!");
}
}
4. Custom Event Data (Tags)
Define the data source fields that you want to pass with the event in DataTagFields
, e.g. DataTagFields="eventtype, background"
.
There are three places where you can access the information from the tag fields:
-
OnBeforeEventRender
event handler (access it ase.Tag["eventtype"]
here and use it to draw custom icons in the event, custom background colors, etc.) -
Event-related events on the client side, e.g. in the
EventClickJavaScript
(ase.tag("eventtype")
). -
Event-related events on the server side, e.g. in the
OnEventClick
event handler (ase.Tag["eventtype"]
).