As of now, when we talk about customization of Appointment Edit Dialog box in C1Schedule for Winforms, we think of creating a new editing form from scratch. But is there any way we can customize the existing Appointment editing box? For example, I want to add a new button besides the Delete button in the Appointment edit box or I don't want the reminder checkbox to be checked by default. Answer to the above question is Yes!!! If we study the class defined for Appointment Edit dialog box, it is nothing but a Windows form. All the buttons, checkboxes, textboxes, e.t.c. are part of control collection of this form. So I think you might have guessed what the trick is behind this blog. All the controls in the appointment edit box are grouped into either a part of a Panel or a toolbar control. You simply have to get to these Panels or Toolbars and add the desired control or remove it from its collection. But this is not the only complete solution. When an appointment box opens, you do not have access to the Appointment edit box. So how can you edit this appointment box? To do so, you have to cancel the existing display of Appointment editing box and then show a new Appointment box mapped to the current appointment object. You can then loop through the structure of this appointment box and do the desired modifications. Lets see the flow of code for the above implementation.
' Flag to determine whether the appointment box is used ' for creating or modifying an appointment Dim newEditingStatus As Boolean = False ' refers to the appointment being modified Dim currentAppointment As C1.C1Schedule.Appointment ' refers to the user defined Appointment Form Dim _customAppointmentForm As C1.Win.C1Schedule.Forms.AppointmentForm
We can implement this in either or both of the following events depending upon the usage.
So, here is the code for both BeforeAppointmentCreate event and BeforeAppointmentShow events.
Private Sub C1Schedule1_BeforeAppointmentCreate(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles C1Schedule1.BeforeAppointmentCreate e.Cancel = True currentAppointment = New C1.C1Schedule.Appointment currentAppointment.Start = Me.C1Schedule1.SelectedInterval.Start currentAppointment.End = Me.C1Schedule1.SelectedInterval.End Me.C1Schedule1.DataStorage.AppointmentStorage.Appointments.Add(currentAppointment) _customAppointmentForm = New C1.Win.C1Schedule.Forms.AppointmentForm(Me.C1Schedule1, currentAppointment) AddHandler \_customAppointmentForm.FormClosing, AddressOf CustomAppointmentForm\_FormClosing ' it defines whether the current Appointment box ' will open for new Appointment or modifying an appointment newEditingStatus = True ModifyForm(_customAppointmentForm) _customAppointmentForm.ShowDialog(Me) End Sub Private Sub C1Schedule1_BeforeAppointmentShow(sender As Object, e As C1.C1Schedule.CancelAppointmentEventArgs) Handles C1Schedule1.BeforeAppointmentShow e.Cancel = True Me.C1Schedule1.DataStorage.AppointmentStorage.Appointments.Add(e.Appointment) _customAppointmentForm = New C1.Win.C1Schedule.Forms.AppointmentForm(Me.C1Schedule1, e.Appointment) AddHandler \_customAppointmentForm.FormClosing, AddressOf CustomAppointmentForm\_FormClosing ModifyForm(_customAppointmentForm) _customAppointmentForm.ShowDialog(Me) End Sub
In the above code snippet, you can see the use of ModifyForm() method. This method implements the code to make the changes in the appointment form.
Public Sub ModifyForm(ByRef _appform As C1.Win.C1Schedule.Forms.AppointmentForm) ' Loop through the controls to do the modifications For i As Integer = _appform.Controls.Count - 1 To 0 Step -1 Dim c As Control = _appform.Controls(i) If c.GetType() = GetType(Panel) Then For j As Integer = c.Controls.Count - 1 To 0 Step -1 Dim d As Control = c.Controls(j) If d.GetType() = GetType(CheckBox) Then ' Uncheck the reminder check box while ' creating a new appointment If d.Name = "chkReminder" Then If newEditingStatus = True Then CType(d, CheckBox).Checked = False End If End If End If Next ElseIf c.GetType() = GetType(ToolStrip) Then ' Add a new custom button If c.Name.Equals("toolStrip1") Then Dim btn As New ToolStripButton() btn.Text = "New Button" AddHandler btn.Click, AddressOf CustomButton_Click CType(c, ToolStrip).Items.Add(btn) End If For j As Integer = 0 To CType(c, ToolStrip).Items.Count - 1 Dim d As ToolStripItem = CType(c, ToolStrip).Items(j) If d.GetType() = GetType(ToolStripButton) Then If d.Name = "btnSave" Then AddHandler CType(d, ToolStripButton).Click, AddressOf SaveButton_Click End If End If Next End If Next End Sub
Private Sub CustomButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) If Not currentAppointment Is Nothing Then MessageBox.Show("This is a new button Action box") End If End Sub Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim app As Appointment = CType(CType(sender, ToolStripButton).Owner.FindForm(), C1.Win.C1Schedule.Forms.AppointmentForm).Appointment C1Schedule1.DataStorage.AppointmentStorage.Appointments.Add(app) End Sub
Public Sub CustomAppointmentForm_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) newEditingStatus = False End Sub
Download the complete sample from the links below. Download C# Sample Download VB Sample