首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Repeater 巢狀綁定實作月曆頁面(二):後端邏輯與資料來源動態產生

     編輯:關於C語言

後端核心邏輯

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 天、今日高亮、跨月空白填補。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved