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:
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]); } |
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.