VB.NET - Usando o controle MonthCalendar

 Neste artigo vou mostrar como podemos usar o controle MonthCalendar para Windows Forms.

O controle MonthCalendar representa um controle de Windows que permite ao usuário selecionar uma data ou intervalo de datas usando uma exibição visual do calendário mensal .

O MonthCalendar controle é desenhado pelo sistema operacional, sendo assim, o evento Paint nunca é gerado. Caso você precise fornecer uma aparência personalizada para o MonthCalendar, deve substituir o método OnPrint, chamando a implementação base do OnPrint e então executar a pintura personalizada.

A primeira coisa a fazer é criar uma aplicação do tipo Windows Application e incluir o componente MonthCalendar a partir da caixa de ferramentas no seu formulário.

Na figura abaixo temos a aparência inicial do calendário : Uma grade que exibe os dias da semana e os dias do mês atual. O mês em curso e o dia atual são exibidos por padrão e o dia também é marcado e destacado na base da grade.

They can select the dates by clicking and dragging across the calendar. After that you can use the SelectionRange, SelectionStart, and SelectionEnd properties to see what dates the user has selected. - See more at: http://www.visual-basic-tutorials.com/Tutorials/Controls/MonthCalendar.html#sthash.qr3AnFtC.dpuf
They can select the dates by clicking and dragging across the calendar. After that you can use the SelectionRange, SelectionStart, and SelectionEnd properties to see what dates the user has selected. - See more at: http://www.visual-basic-tutorials.com/Tutorials/Controls/MonthCalendar.html#sthash.qr3AnFtC.dpuf
They can select the dates by clicking and dragging across the calendar. After that you can use the SelectionRange, SelectionStart, and SelectionEnd properties to see what dates the user has selected. - See more at: http://www.visual-basic-tutorials.com/Tutorials/Controls/MonthCalendar.html#sthash.qr3AnFtC.dpuf
They can select the dates by clicking and dragging across the calendar. After that you can use the SelectionRange, SelectionStart, and SelectionEnd properties to see what dates the user has selected. - See more at: http://www.visual-basic-tutorials.com/Tutorials/Controls/MonthCalendar.html#sthash.qr3AnFtC.dpuf

Podemos selecionar um intervalo de datas clicando e arrastando o mouse através do controle e depois usar as propriedades SelectionRange, SelectionStart e SelectionEnd para obter as datas selecionadas.

A propriedade chave do controle é
SelectionRange, o intervalo de datas selecionadas no controle.

O valor da propriedade não pode exceder o número máximo de dias que pode ser selecionado e esta definido na propriedade MaxSelectionCount. (O valor padrão é 7 dias)

A menor e a maior data que pode ser selecionada é determinada pelas propriedades MaxDate e MinDate.

 MonthCalendar1.MinDate = #1/1/2015#
 MonthCalendar1.MaxDate = #6/30/2015#

ou ainda

MonthCalendar1.MaxDate = New System.DateTime(2015, 12, 31)

ou ainda

Me.MonthCalendar1.MinDate = New System.DateTime(2014, 1, 1, 0, 0, 0, 0)

Para selecionar um intervalo de datas via código podemos fazer assim :

MonthCalendar1.SelectionRange = New SelectionRange(Date.Today, Date.Today.AddDays(7)) - See more at: http://www.visual-basic-tutorials.com/Tutorials/Controls/MonthCalendar.html#sthash.qr3AnFtC.dpuf

MonthCalendar1.SelectionRange = New SelectionRange(Date.Today, Date.Today.AddDays(7))

Nesta linha de código estamos selecionando um intervalo de datas a partir de hoje mais 7 dias.

Alterando as configurações padrão do controle MonthCalendar

Podemos alterar diversas propriedades e métodos do controle personalizando sua aparência. Vejamos o que podemos fazer para isto :

- Para desabilitar a marcação do dia atual defina as propriedades
ShowToday e ShowTodayCircle como False
- Para exibir o número de semanas no ano no calendário defina a propriedade
ShowWeekNumbers como True
- Para exibir múltiplos meses altere o valor padrão da propriedade C
alendarDimensions que é de 1;1 para outro valor; 2;1 por exemplo.
- Para alterar o primeiro dia da semana padrão que é
sunday defina a propriedade FirstDayOfWeek para um valor diferente de default.
- Para alterar a velocidade de rolagem do calendário (em meses) defina a propriedade ScrollChange para um valor diferente de 1. (A taxa de rolagem é o número de meses em que o controle move sua exibição quando o usuário clica em uma seta de rolagem. O valor máximo é de 20.000.)

Abaixo temos a figura que exibe o resultado obtido pela alterações destas configurações:

A definição destas propriedades via código pode ser feita assim:

MonthCalendar1.ShowToday = False
MonthCalendar1.ShowTodayCircle
= False
MonthCalendar1.ShowWeekNumbers = True
MonthCalendar1.FirstDayOfWeek = Day.Monday

Para exibir múltiplos meses via código fazermos :

MonthCalendar1.CalendarDimensions = New System.Drawing.Size (2,1)

Para definir uma data inicial via código podemos fazer assim :  MonthCalendar1.TodayDate = New Date(2015, 5, 22)

Você pode destacar em negrito datas especiais a seu critério usando as propriedades :

BoldedDates - destaca uma única data uma única vez. Ex: MonthCalendar1.AddBoldedDate(Now)
AnnuallyBoldedDates: contém datas que serão destacadas e irão ser exibidas a cada ano.
MonthlyBoldedDates : contém datas que serão destacadas e irão ser exibidas a cada mês.

Cada uma destas propriedades possuem um array de objetos
DateTime .

Abaixo a figura que exibe como configurar as propriedades em tempo de projeto.

Podemos fazer isto via código da seguinte forma : No exemplo a abaixo estou destacando data inicial e final de minhas férias.

Dim minhasFerias1 As Date = New DateTime(2001, 6, 10)
Dim minhasFerias2 As Date = New DateTime(2001, 6, 17)

MonthCalendar1.AddBoldedDate(minhasFerias1)
MonthCalendar1.AddBoldedDate(minhasFerias2)

ou ainda:

Dim minhasFerias1 As Date = New DateTime(2001, 6, 10)
Dim minhasFerias2 As Date = New DateTime(2001, 6, 17)

Dim DataFerias As DateTime() = {minhasFerias1, minhasFerias2}
MonthCalendar1.BoldedDates = DataFerias

Para tornar a exibir a data na fonte regular  use a propriedade RemoveBoldedDate :

MonthCalendar1.RemoveBoldedDate(minhasFerias1)
MonthCalendar1.RemoveBoldedDate(minhasFerias1)

Para remover o destaque de todas as datas use a propriedade RemoveAllBoldedDates :

MonthCalendar1.RemoveAllBoldedDates()

Para datas destacadas anualmente :

        Me.MonthCalendar1.AnnuallyBoldedDates = New System.DateTime() _
                     {New System.DateTime(2015, 1, 1, 0, 0, 0, 0), _
                      New System.DateTime(2015, 4, 28, 0, 0, 0, 0), _
                      New System.DateTime(2015, 5, 5, 0, 0, 0, 0), _
                      New System.DateTime(2015, 9, 7, 0, 0, 0, 0), _
                      New System.DateTime(2015, 12, 25, 0, 0, 0, 0), _ 
                      New System.DateTime(2015, 12, 18, 0, 0, 0, 0)}

Para datas destacadas mensalmente :

       Me.MonthCalendar1.MonthlyBoldedDates = New System.DateTime() _
                     {New System.DateTime(2015, 11, 02, 0, 0, 0, 0), _
                      New System.DateTime(2015, 11, 15, 0, 0, 0, 0)}

Para alterar a aparência e o esquemas de cores do calendários usamos as propriedades : TitleBackColor, TitleForeColor and TrailingForeColor

Nota: No Windows 7 e Windows 8 para que essas alterações seja  efetivadas você tem que desabilitar a propriedade Enable XP visual styles na janela de propriedades do seu projeto.

TitleBackColor - define a cor de fundo do calendário e a cor da fonte para os dias da semana.
TitleForeColor - define a cor do titulo .
TrailingForeColor - determina a cor das datas que precedem e seguem o mês que esta sendo exibido.

Abaixo temos a figura que mostra a aparência para as configurações definidas.

Para obter um data selecionada pelo usuário no controle usamos o evento DateChanged e o método SelectionStart.

Para obter um intervalo de datas usamos o método SelectionRange.Start para a data de início e SelectionRange.End para  a data final do intervalo.

No exemplo a seguir selecionamos o intervalo de datas entre 24/06/2015 a 24/06/2015 no evento Load do formulário form1.vb e usamos o evento DataChanged para obter a data selecionada pelo usuário:

 Private Sub MonthCalendar1_DateChanged(sender As Object, e As DateRangeEventArgs) Handles MonthCalendar1.DateChanged
        Label1.Text = MonthCalendar1.SelectionStart.ToShortDateString
 End Sub
 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        MonthCalendar1.SelectionRange = New SelectionRange( New Date(2015, 6, 24), New Date(2015, 6, 27))
        Label3.Text = MonthCalendar1.SelectionRange.Start
        label4.Text = MonthCalendar1.SelectionRange.End
 End Sub

Podemos usar o vento DateSelected do controle MonthCalendar para exibir o intervalo de datas selecionado pelo usuário.

Private Sub MonthCalendar1_DateSelected(sender As Object, e As DateRangeEventArgs) Handles MonthCalendar1.DateSelected
        ' mostra a data inicial e final no textbox
        Me.TextBox1.Text = "Data Selecionada : Inicio = " + _
                e.Start.ToShortDateString() + " : Fim = " + e.End.ToShortDateString()
End Sub

Abaixo vemos o resultado do código acima :

E ficamos por aqui. Aguarde novos artigos sobre VB.NET.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti