Dibujar calendario con ASP.Net y C#

Hola tyros!

Ver en PHP

Hoy quiero mostrarles como dibujar un calendario HTML como este:


El proceso no es muy complicado. Primero, agregamos una página ASP.Net con el nombre "calendario.aspx", con el siguiente código:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="calendar.aspx.cs" Inherits="examples_calendar" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>TyroDeveloper</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
    <style type="text/css">
        .cal-day-empty {
            background-color: #DDDDDD;
        }
        .cal-day {
            position:relative;
            float:left;
            top:0px;
            left:0px;
            display:block;
            height:20px;
            width:20px;
            padding:0;
            margin:0px;
            border-bottom: 1px solid silver;
            border-right: 1px solid silver;
        }
    </style>
</head>
<body>
    <form id="frmCalendario" runat="server">
        <div class="container">
            <br />
            <asp:Literal ID="litCalendario" runat="server"></asp:Literal>
        </div>
    </form>
</body>
</html>

El siguiente código es el que hace el trabajo:

using System;
using System.Text;
using System.Web.UI;

public partial class examples_calendar : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack) {

            for (int i = 1; i <= 12; i++) {
                litCalendario.Text += DibujarMes(2017,i);
            }
        }
    }

    protected string DibujarMes(int year, int month)
    {
        StringBuilder cal = new StringBuilder();
        double totalDias = DateTime.DaysInMonth(year, month);
        DateTime fechaIni = new DateTime(year, month, 1);
        int diaInicial = ObtenerNumeroDia(fechaIni);
        int diaSemana = 1;
        cal.Append("<table class='table table-bordered'>");
        cal.Append(String.Format("<thead>" +
                        "<tr><th colspan='7' class='text-center'>{0}</th></tr>" +
                        "<tr> " +
                        "   <th class='text-center'>LUNES</th>" +
                        "   <th class='text-center'>MARTES</th>" +
                        "   <th class='text-center'>MIÉRCOLES</th>" +
                        "   <th class='text-center'>JUEVES</th>" +
                        "   <th class='text-center'>VIERNES</th>" +
                        "   <th class='text-center'>SÁBADO</th>" +
                        "   <th class='text-center'>DOMINGO</th>" +
                        "</tr>" +
                    "</thead>", ObtenerMes(month)));
        cal.Append("<tbody>");
        cal.Append("<tr>");

        for (int i = 1; i < diaInicial; i++)
        {
            cal.Append(String.Format("<td class='cal-day-empty'><div class='cal-day'>{0:dd}</div></td>",
                fechaIni.AddDays(i - diaInicial)));
            diaSemana++;
        }

        for (int i = 0; i <= totalDias - 1; i++)
        {
            cal.Append(String.Format("<td>" +
                "<div class='cal-day'>{0:dd}</div>" +
                "<br />Contenido" +
                "</td>", fechaIni.AddDays(i)));
            if (fechaIni.AddDays(i).DayOfWeek == DayOfWeek.Sunday)
            {
                cal.Append("</tr><tr>");
                diaSemana = 1;
            }
            diaSemana++;
        }
        if (fechaIni.AddDays(totalDias - 1).DayOfWeek != DayOfWeek.Sunday)
        {
            int dia = 0;
            for (int j = diaSemana - 1; j <= 7; j++)
            {
                cal.Append(String.Format("<td class='cal-day-empty'><div class='cal-day'>{0:dd}</div></td>",
                    fechaIni.AddDays(totalDias + dia)));
                dia++;
            }
        }
        cal.Append("</tr>");
        cal.Append("</tbody>");
        cal.Append("</table>");
        return cal.ToString();
    }

    int ObtenerNumeroDia(DateTime fecha) {
        switch (fecha.DayOfWeek) {
            case DayOfWeek.Monday:
                return 1;
            case DayOfWeek.Tuesday:
                return 2;
            case DayOfWeek.Wednesday:
                return 3;
            case DayOfWeek.Thursday:
                return 4;
            case DayOfWeek.Friday:
                return 5;
            case DayOfWeek.Saturday:
                return 6;
            case DayOfWeek.Sunday:
                return 7;
            default:
                return 0;
        }
    }
    string ObtenerMes(int mes) {
        string[] meses = {
            "ENERO",
            "FEBRERO",
            "MARZO",
            "ABRIL",
            "MAYO",
            "JUNIO",
            "JULIO",
            "AGOSTO",
            "SEPTIEMBRE",
            "OCTUBRE",
            "NOVIEMBRE",
            "DICIEMBRE" };
        if ((mes >= 1) && (mes <= 12))
        {
            return meses[mes-1];
        }
        else {
            return "";
        }
    }
}


Si alguien de ustedes encuentra una mejor manera de hacerlo, por favor compartir.

No hay comentarios:

Publicar un comentario