New to Telerik UI for ASP.NET AJAX? Download free 30-day trial

Using the Data Source Property

RadScheduler has a DataSource property that lets you bind it to any object that implements the IListSource or IEnumerable interface. Thus, you can bind the scheduler directly to a DataTable or DataView (IListSource), or to various List objects (IEnumerable).

When using the DataSource property to bind the scheduler, you must also implement the code for inserting, updating, and deleting appointments using the RadScheduler server-side events. A sample implementation can be found in the Scheduler bound to a List using the DataSource property Code Library project.

If you are using custom fields/attributes, you must write them directly to the data source in these events, so you can later access them in the AppointmentDataBound event and either use them for your logic, or add them to the Attributes collection of the appointment.

In the AppointmentDataBound event, you must check whether the DataItem of the appointment has been initialized before accessing it, for example:

protected void RadScheduler1_AppointmentDataBound(object sender, SchedulerEventArgs e)
{
    if (!object.Equals(e.Appointment.DataItem, null))
    {
        //if using a custom class
        string custAttr = (e.Appointment.DataItem as MyCustomAppointmentInfo).CustomAttr;
        //if using a generic object like DataTable
        string data = (e.Appointment.DataItem as System.Data.DataRowView)["CustomAttr"].ToString();
    }
}
Protected Sub RadScheduler1_AppointmentDataBound(ByVal sender As Object, ByVal e As SchedulerEventArgs)
    If Not Object.Equals(e.Appointment.DataItem, Nothing) Then
        'if using a custom class
        Dim custAttr As String = (TryCast(e.Appointment.DataItem, MyCustomAppointmentInfo)).CustomAttr
        'if using a generic object like DataTable
        Dim data As String = (TryCast(e.Appointment.DataItem, System.Data.DataRowView))("CustomAttr").ToString()
    End If
End Sub

Example

The following example demonstrates binding to a generic list of objects, which represents appointment information, including a custom resource for room. It implements AppointmentInsert, AppointmentUpdate, and AppointmentDelete event handlers to allow the scheduler to insert, update, and delete appointments.

1) Drag a RadScheduler control from the toolbox onto your page.

2) Move to the code-behind page for your web page, and add two lines to the using section (C#) or Imports section (VB).

using Telerik.Web.UI;
using System.Collections.Generic;
Imports Telerik.Web.UI
Imports System.Collections.Generic

3) In the definition of the class for your Web page, add two class definitions, one to hold information about appointments, and another to hold information about the custom resource (rooms):

class AppointmentInfo
{
    private string id;
    private string subject;
    private DateTime start;
    private DateTime end;
    private string recurParentID;
    private string recurData;
    private int room;

    public string ID
    {
        get { return id; }
        set { id = value; }
    }
    public string Subject
    {
        get { return subject; }
        set { subject = value; }
    }
    public DateTime Start
    {
        get { return start; }
        set { start = value; }
    }
    public DateTime End
    {
        get { return end; }
        set { end = value; }
    }
    public string RecurrenceRule
    {
        get { return recurData; }
        set { recurData = value; }
    }
    public string RecurrenceParentID
    {
        get { return recurParentID; }
        set { recurParentID = value; }
    }
    public int RoomNo
    {
        get { return room; }
        set { room = value; }
    }

    private AppointmentInfo()
    {
        this.id = Guid.NewGuid().ToString();
    }
    public AppointmentInfo(string subject, DateTime start, DateTime end): this()
    {
        this.subject = subject;
        this.start = start;
        this.end = end;
    }
    public AppointmentInfo(Appointment source): this()
    {
        CopyInfo(source);
    }

    public void CopyInfo(Appointment source)
    {
        subject = source.Subject;
        start = source.Start;
        end = source.End;
        recurData = source.RecurrenceRule;
        if (source.RecurrenceParentID != null)
            recurParentID = source.RecurrenceParentID.ToString();
        Resource r = source.Resources.GetResourceByType("Room");
        if (r != null)
            room = (int) r.Key;
    }
}

class RoomInfo
{
    private int id;
    private string name;

    public int RoomNo
    {
        get { return id; }
    }

    public string RoomName
    {
        get { return name; }
    }

    public RoomInfo(int id, string name)
    {
        this.id = id;
        this.name = name;
    }
} 
Class AppointmentInfo
    Private id As String
    Private subject As String
    Private start As DateTime
    Private [end] As DateTime
    Private recurParentID As String
    Private recurData As String
    Private room As Integer

    Public Property ID() As String
        Get
            Return id
        End Get
        Set(ByVal value As String)
            id = value
        End Set
    End Property
    Public Property Subject() As String
        Get
            Return subject
        End Get
        Set(ByVal value As String)
            subject = value
        End Set
    End Property
    Public Property Start() As DateTime
        Get
            Return start
        End Get
        Set(ByVal value As DateTime)
            start = value
        End Set
    End Property
    Public Property [End]() As DateTime
        Get
            Return [end]
        End Get
        Set(ByVal value As DateTime)
            [end] = value
        End Set
    End Property

    Public Property RecurrenceRule() As String
        Get
            Return recurData
        End Get
        Set(ByVal value As String)
            recurData = value
        End Set
    End Property
    Public Property RecurrenceParentID() As String
        Get
            Return recurParentID
        End Get
        Set(ByVal value As String)
            recurParentID = value
        End Set
    End Property
    Public Property RoomNo() As Integer
        Get
            Return room
        End Get
        Set(ByVal value As Integer)
            room = value
        End Set
    End Property
    Private Sub New()
        Me.id = Guid.NewGuid().ToString()
    End Sub

    Public Sub New(ByVal subject As String, ByVal start As DateTime, _
        ByVal [end] As DateTime)
        Me.New()
        Me.subject = subject
        Me.start = start
        Me.[end] = [end]
    End Sub
    Public Sub New(ByVal source As Appointment)
        Me.New()
        CopyInfo(source)
    End Sub

    Public Sub CopyInfo(ByVal source As Appointment)
        subject = source.Subject
        start = source.Start
        [end] = source.[End]
        recurData = source.RecurrenceRule
        If source.RecurrenceParentID <> Nothing Then
            recurParentID = source.RecurrenceParentID.ToString()
        End If
        Dim r As Resource = source.Resources.GetResourceByType("Room")
        If r <> Nothing Then
            room = DirectCast(r.Key, Integer)
        End If
    End Sub
End Class

Class RoomInfo
    Private id As Integer
    Private name As String
    Public ReadOnly Property RoomNo() As Integer
        Get
            Return id
        End Get
    End Property
    Public ReadOnly Property RoomName() As String
        Get
            Return name
        End Get
    End Property
    Public Sub New(ByVal id As Integer, ByVal name As String)
        Me.id = id
        Me.name = name
    End Sub
End Class

4) Add two private properties to the class for your Web page whose values are the current list of appointments and the list of rooms. The appointments list needs to persist, so we save that one in the session state:

private const string AppointmentsKey = "Telerik.Examples.Scheduler.BindToList_Apts";

private List<AppointmentInfo> Appointments
{
    get
    {
        List<AppointmentInfo> sessApts = Session[AppointmentsKey] as List<AppointmentInfo>;

        if (sessApts == null)
        {
            sessApts = new List<AppointmentInfo>();
            Session[AppointmentsKey] = sessApts;
        }

        return sessApts;
    }
}

private List<RoomInfo> Rooms
{
    get
    {
        List<RoomInfo> roomList = new List<RoomInfo>();

        roomList.Add(new RoomInfo(1, "Margaret Morrison Main Room"));
        roomList.Add(new RoomInfo(2, "Black Auditorium"));
        roomList.Add(new RoomInfo(3, "Doherty Auditorium"));

        return roomList;
    }
} 
Private Const AppointmentsKey As String = "Telerik.Examples.Scheduler.BindToList_Apts"

Private ReadOnly Property Appointments() As List(Of AppointmentInfo)
    Get
        Dim sessApts As List(Of AppointmentInfo) = _TryCast(Session(AppointmentsKey), List(Of AppointmentInfo))

        If sessApts = Nothing Then
            sessApts = New List(Of AppointmentInfo)()
            Session(AppointmentsKey) = sessApts
        End If

        Return sessApts
    End Get
End Property

Private ReadOnly Property Rooms() As List(Of RoomInfo)
    Get
        Dim roomList As New List(Of RoomInfo)()

        roomList.Add(New RoomInfo(1, "Margaret Morrison Main Room"))
        roomList.Add(New RoomInfo(2, "Black Auditorium"))
        roomList.Add(New RoomInfo(3, "Doherty Auditorium"))

        Return roomList
    End Get
End Property

5) Add the FindById helper function to the class for your Web page:

private AppointmentInfo FindById(string ID)
{
    foreach (AppointmentInfo ai in Appointments)
    {
        if (ai.ID == ID)
        {
            return ai;
        }
    }

    return null;
} 

Private Function FindById(ByVal ID As String) As AppointmentInfo
    For Each ai As AppointmentInfo In Appointments
        If ai.ID = ID Then
            Return ai
        End If
    Next

    Return Nothing
End Function

6) In the Page_Load event handler, add code to initialize the RadScheduler so that it can read the appointment information, define the custom resource type for rooms, and set the DataSource property to bind the scheduler to the data.

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Session.Remove(AppointmentsKey);

        RadScheduler1.DataKeyField = "ID";
        RadScheduler1.DataStartField = "Start";
        RadScheduler1.DataEndField = "End";
        RadScheduler1.DataSubjectField = "Subject";
        RadScheduler1.DataRecurrenceField = "RecurrenceRule";
        RadScheduler1.DataRecurrenceParentKeyField = "RecurrenceParentID";

        ResourceType rt = new ResourceType("Room");

        rt.DataSource = Rooms;
        rt.KeyField = "RoomNo";
        rt.ForeignKeyField = "RoomNo";
        rt.TextField = "RoomName";

        RadScheduler1.ResourceTypes.Add(rt);
    }

    RadScheduler1.DataSource = Appointments;
} 
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyPage.Load
    If Not IsPostBack Then
        Session.Remove(AppointmentsKey)

        RadScheduler1.DataKeyField = "ID"
        RadScheduler1.DataStartField = "Start"
        RadScheduler1.DataEndField = "End"
        RadScheduler1.DataSubjectField = "Subject"
        RadScheduler1.DataRecurrenceField = "RecurrenceRule"
        RadScheduler1.DataRecurrenceParentKeyField = "RecurrenceParentID"

        Dim rt As New ResourceType("Room")

        rt.DataSource = Rooms
        rt.KeyField = "RoomNo"
        rt.ForeignKeyField = "RoomNo"
        rt.TextField = "RoomName"

        RadScheduler1.ResourceTypes.Add(rt)
    End If
    RadScheduler1.DataSource = Appointments
End Sub

7) Return to the designer for Default.aspx and select the RadScheduler control.

8) In the properties pane, double-click on the AppointmentInsert event and add the following event handler:

protected void RadScheduler1_AppointmentInsert(object sender, SchedulerCancelEventArgs e)
{
    Appointments.Add(new AppointmentInfo(e.Appointment));
} 
Protected Sub RadScheduler1_AppointmentInsert( ByVal sender As Object, ByVal e As SchedulerCancelEventArgs) Handles RadScheduler1.AppointmentInsert
    Appointments.Add(New AppointmentInfo(e.Appointment))
End Sub

9) Double-click on the AppointmentUpdate event and add the following event handler:

protected void RadScheduler1_AppointmentUpdate(object sender, AppointmentUpdateEventArgs e)
{
    AppointmentInfo ai = FindById(e.ModifiedAppointment.ID.ToString());
    ai.CopyInfo(e.ModifiedAppointment);
} 
Protected Sub RadScheduler1_AppointmentUpdate( ByVal sender As Object, ByVal e As AppointmentUpdateEventArgs) Handles RadScheduler1.AppointmentUpdate
    Dim ai As AppointmentInfo = FindById(e.ModifiedAppointment.ID.ToString())
    ai.CopyInfo(e.ModifiedAppointment)
End Sub

10) Double-click on the AppointmentDelete event and add the following event handler:

protected void RadScheduler1_AppointmentDelete(object sender, SchedulerCancelEventArgs e)
{
    Appointments.Remove(FindById(e.Appointment.ID.ToString()));
} 
Protected Sub RadScheduler1_AppointmentDelete( ByVal sender As Object, ByVal e As SchedulerCancelEventArgs) Handles RadScheduler1.AppointmentDelete
    Appointments.Remove(FindById(e.Appointment.ID.ToString()))
End Sub

You have now bound your scheduler using the DataSource property. Run the application andnote the custom resource is available in the edit form.

See Also

In this article