DateTime date = DateTime.Now;
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["date"] != null)
date = Convert.ToDateTime(Request.QueryString["date"]).AddMonths(Convert.ToInt32(Request.QueryString["goto"]));
hdDate.Value = date.ToString();
if (!Page.IsPostBack)
{
lblDate.Text = date.ToString("yyyy年MM月");
BindWeek();
}
}
private void BindWeek()
{
DateTime firstDay = date.AddDays(1 - date.Day);
int weekCount = 1;
for (int i = 1; i < 32; i++)
{
if (firstDay.AddDays(i).Month == firstDay.Month)
if (firstDay.AddDays(i).DayOfWeek == DayOfWeek.Sunday) weekCount++;
else break;
}
var ds = new DataSet();
var weekTable = new DataTable("weekTable");
ds.Tables.Add(weekTable);
weekTable.Columns.Add("id");
weekTable.Columns.Add("Text");
for (int i = 1; i <= weekCount; i++)
{
var row = weekTable.NewRow();
row["id"] = i;
row["Text"] = "第" + i + "周";
weekTable.Rows.Add(row);
}
rptParent.DataSource = ds.Tables[0];
rptParent.DataBind();
}
protected void rptParent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var rptChild = (Repeater)e.Item.FindControl("rptChild");
rptChild.DataSource = GetWeekTable(Convert.ToInt32(DataBinder.Eval(e.Item.DataItem, "id")));
rptChild.DataBind();
}
}
protected void rptChild_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var img = (HtmlImage)e.Item.FindControl("imgAdd");
if (DataBinder.Eval(e.Item.DataItem, "week") != DBNull.Value)
{
DateTime dt = Convert.ToDateTime(DataBinder.Eval(e.Item.DataItem, "date"));
if (dt.Date == DateTime.Now.Date)
{
var td = (HtmlTable)e.Item.FindControl("colorCell");
td.Attributes["style"] = "background-color:#F9E97D;";
}
}
}
}
private DataTable GetWeekTable(int weekNo)
{
var ds = new DataSet();
var table = new DataTable("weekTable");
ds.Tables.Add(table);
table.Columns.Add("week");
table.Columns.Add("date", typeof(DateTime));
DateTime baseDay = date.AddDays(1 - date.Day);
int firstWeekDay = (int)baseDay.DayOfWeek;
if (weekNo == 1)
{
if (firstWeekDay > 0)
for (int i = firstWeekDay - 1; i >= 0; i--) table.Rows.Add(table.NewRow()); // 填空白
for (int i = firstWeekDay; i < 7; i++)
{
var row = table.NewRow();
row["week"] = i;
row["date"] = baseDay.AddDays(i - firstWeekDay);
table.Rows.Add(row);
}
}
else
{
DateTime start = firstWeekDay > 0
? baseDay.AddDays((weekNo - 1) * 7 - firstWeekDay)
: baseDay.AddDays((weekNo - 1) * 7);
for (int i = 0; i < 7; i++)
{
DateTime d = start.AddDays(i);
if (d.Month != start.Month) break;
var row = table.NewRow();
row["week"] = i;
row["date"] = d;
table.Rows.Add(row);
}
// 補足尾部空白
for (int i = table.Rows.Count; i < 7; i++) table.Rows.Add(table.NewRow());
}
return table;
}
完整實現:週數計算、外層 Repeater 綁定週標題、內層 Repeater 綁定每週 7 天、今日高亮、跨月空白填補。