 | | Home |  |
 | | Controle Calendar e Banco de Dados |  | Aprenda a manipular registros vindo de uma base de dados com o controle calendar. Muitas vezes armazenamos em um banco de dados informações com dados e seus respectivos acontecimentos. Existem vários exemplos disso em nosso dia à dia: Eventos que serão realizados em uma determinada data e também um outro exemplo bem conhecido é o de Agendas, onde armazenamos na base de dados os compromissos/anotações para aquela respectiva data.
Nestes cenários o que se utiliza bastante é o controle Calendar, qual é disponibilizado pelo ASP.NET já intrinsicamente. Para o cenário de exemplo, vamos ter uma tabela que armazena os eventos de tecnologia de uma determinada região. Apenas para ilustrar, eu estarei criando um objeto do tipo DataTable para armazenar estes eventos. Em um cenário real, esses dados devem se originar de uma base de dados (ou um outro repositório qualquer), armazenar temporariamente em um objeto do tipo DataTable e, através do evento DayRender do controle Calendar, que é disparado a cada Data (dia) que será renderizado na tela, efetuamos a consulta para aquela data no objeto DataTable temporário e, se existir, atribuimos a célula correspondente o nome do evento. É importante ressalvar que, não se deve ir a todo momento fazer a pesquisa diretamente na base de dados, em outras palavras, efetuar essa pesquisa no evento DayRender, pois isso comprometerá a performance da página/aplicação.
Para alcançarmos o objetivo, devemos criar um membro privado do tipo DataTable, que este armazenará os dados temporariamente provenientes da base dados. Vejamos abaixo o código completo:

C#
private DataTable _dtEventos;
private void Page_Load(object sender, System.EventArgs e) { if(!Page.IsPostBack) this.ResgataDados(); }
private void ResgataDados(){ this._dtEventos = new DataTable();
this._dtEventos.Columns.Add(new DataColumn("Nome", typeof(String))); this._dtEventos.Columns.Add(new DataColumn("Data", typeof(DateTime)));
DataRow evento1 = this._dtEventos.NewRow(); evento1[0] = "Evento Microsoft"; evento1[1] = "19/10/2005"; this._dtEventos.Rows.Add(evento1);
DataRow evento2 = this._dtEventos.NewRow(); evento2[0] = "Evento Linha de Código"; evento2[1] = "25/10/2005"; this._dtEventos.Rows.Add(evento2); }
private void Calendar1_DayRender( object sender, System.Web.UI.WebControls.DayRenderEventArgs e) { string query = string.Concat("Data = #", e.Day.Date.ToString("MM/dd/yyyy"), "#"); DataRow[] dr = this._dtEventos.Select(query); if(dr.Length > 0) e.Cell.Text = Convert.ToString(dr[0][0]); }
VB.net
Private _dtEventos As DataTable
Private Sub Page_Load( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load
If Not Page.IsPostBack Then Call Me.ResgataDados() End If End Sub
Private Sub ResgataDados() Me._dtEventos = New DataTable Me._dtEventos.Columns.Add(New DataColumn("Nome", GetType(String))) Me._dtEventos.Columns.Add(New DataColumn("Data", GetType(DateTime)))
Dim evento1 As DataRow = Me._dtEventos.NewRow() evento1(0) = "Evento Microsoft" evento1(1) = "19/10/2005" Me._dtEventos.Rows.Add(evento1)
Dim evento2 As DataRow = Me._dtEventos.NewRow() evento2(0) = "Evento Linha de Código" evento2(1) = "25/10/2005" Me._dtEventos.Rows.Add(evento2) End Sub
Private Sub Calendar1_DayRender( _ ByVal sender As Object, _ ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) _ Handles Calendar1.DayRender
Dim query As String = String.Concat("Data = #", e.Day.Date.ToString("MM/dd/yyyy"), "#") Dim dr() As DataRow = Me._dtEventos.Select(query) If dr.Length > 0 Then e.Cell.Text = Convert.ToString(dr(0)(0)) End If End Sub Como podemos ver, no evento Load do WebForm e instanciamos e criamos a estrutura do objeto DataTable que é membro desta página. Para o exemplo, duas colunas estão sendo criadas: Nome do evento e a Data em que o evento irá acontecer. Logo em seguida, dois objetos do tipo DataRow são criados. quais representarão os registros de uma base de dados e, consequentemente são adicionados na coleção de linhas do objeto DataTable.
Como o evento DayRender do controle Calendar acontece depois do evento Load do WebForm, quando o mesmo for invocado, já teremos o objeto DataTable populado com os dados da base de dados e, é exatamente neste momento que a consulta deverá ser realizada para exibir ou não o nome do evento para o usuário, caso a consulta resulte em algum registro. Como já disse acima, o evento DayRender é disparado para cada data (dia) que será mostrada pelo calendário e, neste mesmo evento, recebemos como parâmetro um objeto do tipo DayRenderEventArgs que fornece toda a infraestrura para manipularmos a célula (dia) corrente.
Através do método Select do DataTable fazemos a consulta na coluna "Data" do membro DataTable, passando como parâmetro o dia corrente e, se existir um evento para esta data que está sendo consultada, definimos o nome deste evento para ser exibido ao usuário.
[02/04/2007 10:03 - Fabrizio Gianfratti]
|