this.Controls.Clear();
#region Variables
lTitulo = new Label();
lSiguiente = new LinkButton();
ImSiguiente = new ImageButton();
lAnterior = new LinkButton();
ImAnterior = new ImageButton();
LCalendarios = new List<Calendar>();
#endregion Variables
Como podéis comprobar lo primero que hacemos es limpiar la colección de controles secundarios e instanciar los nuevos.
Seguidamente comenzamos con la navegación y el título del control.
#region Título
lTitulo.Text = this.Titulo;
lAnterior.Text = this.TxtAnterior;
lAnterior.Click += new EventHandler(lAnterior_Click);
ImAnterior.ImageUrl = this.ImgAnterior;
ImAnterior.ImageAlign = ImageAlign.Baseline;
ImAnterior.Click += new ImageClickEventHandler(ImgAnterior_Click);
lSiguiente.Text = this.TxtSiguiente;
lSiguiente.Click += new EventHandler(lSiguiente_Click);
ImSiguiente.ImageUrl = this.ImgSiguiente;
ImSiguiente.ImageAlign = ImageAlign.Baseline;
ImSiguiente.Click += new ImageClickEventHandler(ImgSiguiente_Click);
#endregion Título
Dos cosas destacan de este código, la primera es que utilizaremos propiedades que veremos más adelante para formatear nuestros controles secundarios.
lTitulo.Text = this.Titulo;
Y la segunda es que enlazamos el evento Click del control secundario a un evento del control.
lAnterior.Click += new EventHandler(lAnterior_Click);
Porque tenemos que hacer esto???
[Category("AciCalendar")]
[Description("Evento de anterior posterior mes.")]
public event EventHandler MonthChanged;
protected void OnMonthChanged(EventArgs e)
{
if (MonthChanged != null)
{
MonthChanged(this, e);
}
}
private void lSiguiente_Click(object sender, EventArgs e)
{
this.FechaInicial = this.FechaInicial.AddMonths(this.Calendarios);
CargarCalendarios();
//lanzamos el evento del control
OnMonthChanged(EventArgs.Empty);
}
Como NO tenemos acceso directo a los eventos generados por los controles secundarios, tenemos dos opciones o hacer que estos eventos se propaguen a nuestro control o crear un evento nuevo en el control que sea lanzado por el evento de un control secundario. Uff!!
En este caso he creado un evento nuevo MonthChanged que es lanzado cuando se hace Click en el link Siguiente. De esta forma podemos controlar cuando el usuario hace click en nuestro control para avanzar los meses necesarios en nuestro control.
private void lSiguiente_Click(object sender, EventArgs e)
{
...
//lanzamos el evento del control
OnMonthChanged(EventArgs.Empty);
}
Ahora seguimos con la creación de los controles secundarios ;)
#region Calendarios
int col = this.Calendarios / this.Filas;
int mes = 0;
for (int y = 0; y < this.Filas; y++)
{
for (int x = 0; x < col; x++, mes++)
{
#region calendario
Calendar cal = new Calendar();
cal.ShowNextPrevMonth = false;
cal.VisibleDate = FechaInicial.AddMonths(mes);
cal.SelectionChanged +=
new EventHandler(this.cal_SelectionChanged);
cal.DayRender += new DayRenderEventHandler(cal_DayRender);
CargarFechas(cal);
//le aplicamos los estilos.
cal.CssClass = this.CssCalendario;
cal.SelectorStyle.CopyFrom(this.SelectorStyle);
cal.DayHeaderStyle.CopyFrom(this.DayHeaderStyle);
cal.WeekendDayStyle.CopyFrom(this.WeekendDayStyle);
cal.TodayDayStyle.CopyFrom(this.TodayDayStyle);
cal.SelectedDayStyle.CopyFrom(this.SelectedDayStyle);
cal.TitleStyle.CopyFrom(this.TitleStyle);
cal.DayStyle.CopyFrom(this.DayStyle);
cal.OtherMonthDayStyle.CopyFrom(this.OtherMonthDayStyle);
cal.SelectionMode = CalendarSelectionMode.DayWeekMonth;
cal.SelectedDayStyle.BackColor = this.ColorFondo;
cal.SelectedDayStyle.ForeColor = this.ColorTexto;
LCalendarios.Add(cal);
this.Controls.Add(cal);
#endregion calendario
#endregion calendarios
this.Controls.Add(lAnterior);
this.Controls.Add(ImAnterior);
this.Controls.Add(lTitulo);
this.Controls.Add(lSiguiente);
this.Controls.Add(ImSiguiente);
Como podéis comprobar podemos elegir el Nº de columnas y el Nº de filas que queramos que utilice el control y el Nº total de calendarios a repartir.
Entonces creará los calendarios necesarios, le enlaza los eventos SelectionChanged, DayRender y establecerá propiedades y estilos para los controles.
Finalmente agregará el calendario a la lista de calendarios y también a la colección de controles secundarios de nuestro control.
Bueno ya tenemos la base de nuestro control creado con esto, espero que os esté interesando el tema y no os haya aburrido demasiado.
Dejaremos la parte final del proyecto para el siguiente artículo espero veros.