我正在寻找一个asp.net控件,它将以网格格式显示一整年,每个月作为一行,每月的每一天作为列.我找到了以下经典的ASP脚本,它生成了正确的格式:
http://www.livio.net/code/calendar_36/CalendarTestYearly36.asp?infomode=HELP(参见年历)
有没有这样的东西,或者有没有办法在没有特定控制的情况下做到这一点?我是asp.net的新手.
谢谢
解决方法
鞭打这个,只为你:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Yearly Calendar</title> <style type="text/css"> table td { padding:0; margin:0; border:1px solid #dadada; } table th { width:25px; text-align:center; } table td { text-align:center; } table td span { color:#dadada; } table td a { color:#000000; text-decoration:none; } table td a:hover { text-decoration:underline; } table td a.hasEvents { color:#ff0000; } table td a.selected { color:#0000ff; font-weight:bold; } table td.month { background-color:#999999; } table td.weekend { background-color:#D0D0D0; } </style> </head> <body> <form id="form1" runat="server"> <div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th> <asp:Literal ID="litSelectedYear" runat="server" /> </th> <% for (int iWeek = 1; iWeek <= 6; iWeek++) { for (int iDay = 1; iDay <= 7; iDay++) { if (iWeek == 6 && iDay > 2) break; %> <th> <%= GetDayName(iDay) %> </th> <% } } %> </tr> </thead> <asp:Repeater ID="repMonths" runat="server" OnInit="repMonths_OnInit" OnItemDataBound="repMonths_OnItemDataBound"> <ItemTemplate> <tr> <td class="month"> <asp:HyperLink ID="hylMonth" runat="server" /> </td> <asp:Repeater ID="repDays" runat="server" OnItemDataBound="repDays_OnItemDataBound"> <ItemTemplate> <td id="tdDay" runat="server"> <asp:Literal ID="litDay" runat="server" /> </td> </ItemTemplate> </asp:Repeater> </tr> </ItemTemplate> </asp:Repeater> </table> </div> </form> </body> </html>
using System; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { private DateTime _dtMonth; private DateTime _selectedDate; private bool _specialDaySelected = true; private int _currentBindingMonth; protected void repMonths_OnInit(object sender,EventArgs e) { if (!DateTime.TryParse(Request.QueryString["CalDate"],out _selectedDate)) { _specialDaySelected = false; int selectedMonth,selectedYear; int.TryParse(Request.QueryString["CalYear"],out selectedYear); int.TryParse(Request.QueryString["CalMonth"],out selectedMonth); if (selectedYear <= 0) selectedYear = DateTime.Now.Year; if (selectedMonth <= 1) selectedMonth = 1; else if (selectedMonth > 12) selectedMonth = 12; _selectedDate = new DateTime(selectedYear,selectedMonth,1); } litSelectedYear.Text = _selectedDate.Year.ToString(); repMonths.DataSource = new int[]{1,2,3,4,5,6,7,8,9,10,11,12}; repMonths.DataBind(); } protected void repMonths_OnItemDataBound(object sender,RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Repeater repDays = (Repeater)e.Item.FindControl("repDays"); HyperLink hylMonth = (HyperLink)e.Item.FindControl("hylMonth"); _currentBindingMonth = (int)e.Item.DataItem; _dtMonth = new DateTime(_selectedDate.Year,_currentBindingMonth,1); hylMonth.Text = _dtMonth.ToString("MMM"); hylMonth.NavigateUrl = string.Format("{0}?CalMonth={1}&CalYear={2}",Request.Path,_selectedDate.Year); if (_currentBindingMonth == _selectedDate.Month) hylMonth.Attributes.Add("class","selected"); if (_dtMonth.DayOfWeek != DayOfWeek.Monday) { int daysToSubtract = -(int)_dtMonth.DayOfWeek; if (_dtMonth.DayOfWeek == DayOfWeek.Sunday) daysToSubtract = -7; // Special case. US weeks start with sunday,thus the enum DayOfWeek.Sunday = 0. _dtMonth = _dtMonth.AddDays(daysToSubtract + 1); } DateTime[] dates = new DateTime[37]; for (int i = 0; i < 37; i++) { dates[i] = _dtMonth; _dtMonth = _dtMonth.AddDays(1); } repDays.DataSource = dates; repDays.DataBind(); } } protected void repDays_OnItemDataBound(object sender,RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { DateTime date = (DateTime)e.Item.DataItem; Literal litDay = (Literal)e.Item.FindControl("litDay"); HtmlTableCell tdDay = (HtmlTableCell)e.Item.FindControl("tdDay"); if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) tdDay.Attributes.Add("class","weekend"); if (_currentBindingMonth == date.Month) litDay.Text = string.Format("<a href=\"{0}?CalDate={3}-{2}-{1}\"{4}>{3}</a>",date.Year,date.Month,date.Day.ToString("D2"),(_specialDaySelected && date.Equals(_selectedDate)) ? " class=\"selected\"" : string.Empty); else litDay.Text = string.Format("<span>{0}</span>",date.Day.ToString("D2")); // Clear ID's tdDay.ID = string.Empty; } } public static string GetDayName(int dayInWeek) { switch (dayInWeek) { case 1: return "mo"; case 2: return "tu"; case 3: return "we"; case 4: return "th"; case 5: return "fr"; case 6: return "sa"; case 7: return "su"; } return "God only made seven days in a week."; } }