repeater 控件是一个很灵活的东东,本人在程序开发中就最爱用到它了!!!
很多朋友应该在使用 VS2005 自带的 日历控件的时候 都发现或多或少的 不能满足自己的特殊需求

这个实例看似很简单  但如果能够家里改善 将能很好的运用到自己的程序当中(至少比用JS写个控件简单方便,还能很好的很数据库关联开发),本代码只粘贴出了日历的实现,实际上我用到了四个repeater 的嵌套 实现的是一个日程管理的系统, 剩下的和数据库有关联,所以删掉了!  希望对想使用日历控件的朋友有一定的帮助,注释写的很清楚了,朋友们可以随便改动 (程序有注释的,希望大家粘贴到VS 2005 中去看  很直观 很清楚的)

 

aspx 页面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test.Web._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 + n;
        }

    </script>
</head>
<body>
    <form />
    </form>
</body>
</html>

 

.CS文件

 

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Test.Web
{
    public partial class _Default : System.Web.UI.Page
    {
        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 obj = date.AddDays(1 - date.Day);//获取本月第一天

            int week = 1;
            for (int i = 1; i < 32; i++)
            {
                DateTime newDay = obj.AddDays(i);
                if (newDay.Month == obj.Month)//判断天数加一后的时间是否还在本月内
                {
                    if (newDay.DayOfWeek == 0) week++;//累加得到本月共有几周
                }
                else break;
            }

            DataSet ds = new DataSet();//创建一个dtatset 用来作为repeater 的数据源
            DataTable weekTable = new DataTable("weekTable");//创建一个dateTable 存放周表(即日历的行数)
            ds.Tables.Add(weekTable);
            weekTable.Columns.Add("id");
            weekTable.Columns.Add("Text");
            for (int i = 1; i <= week; i++)
            {
                DataRow datarow = weekTable.NewRow();
                datarow["id"] = i;
                datarow["text"] = "第" + i.ToString() + "周";
                ds.Tables["weekTable"].Rows.Add(datarow);
            }

            rptParent.DataSource = ds.Tables[0];//绑定第一个repeater  即日历的行数
            rptParent.DataBind();
        }

        protected void rptParent_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater 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)
            {
                //根据不同样式 设置 添加按钮 图片路径               
                HtmlImage img = (HtmlImage)e.Item.FindControl("imgAdd");
                if (DataBinder.Eval(e.Item.DataItem, "week") != System.DBNull.Value) {
                    DateTime newTime = Convert.ToDateTime((DataBinder.Eval(e.Item.DataItem, "date")));

                    if (newTime.Date == DateTime.Now.Date)
                    {
                        HtmlTable td = (HtmlTable)e.Item.FindControl("colorCell");
                        td.Attributes.Add("style", "background-color:#F9E97D;");
                    }
                }
            }
        }

        /// <summary>
        /// 获得本月 某一周的具体日期(不足七天的  比如第一周不是从周日开始的或者最后一周不是以周六结束的 )都以空时间 补充到 周详细表中
        /// </summary>
        /// <param name="n">本月的第几周</param>
        /// <returns>返回本月某一周的 具体 日期 的一个集合</returns>
        private DataTable GetWeekTable(int n)
        {
            DataSet ds = new DataSet();
            DataTable weekTable = new DataTable("weekTable");
            ds.Tables.Add(weekTable);
            weekTable.Columns.Add("week");
            weekTable.Columns.Add("date");
            weekTable.Columns[1].DataType = Type.GetType("System.DateTime");

            DateTime obj = new DateTime();
            if (n == 1)//如果是第一周
            {
                obj = date.AddDays(1 - date.Day);
                int week = (int)obj.DayOfWeek;
                if (week > 0)//如果不是周日 将补上空白
                {
                    for (int i = week - 1; i >= 0; i--)
                    {
                        DataRow datarow = weekTable.NewRow();
                        ds.Tables["weekTable"].Rows.Add(datarow);
                    }
                    for (int i = week; i < 7; i++)
                    {
                        DataRow datarow = weekTable.NewRow();
                        datarow["week"] = i;
                        datarow["date"] = obj.AddDays(i - week);
                        ds.Tables["weekTable"].Rows.Add(datarow);
                    }
                }
                else
                {//如果是周日  直接加上七天
                    for (int i = 0; i < 7; i++)
                    {
                        DataRow datarow = weekTable.NewRow();
                        datarow["week"] = i;
                        datarow["date"] = obj.AddDays(i);
                        ds.Tables["weekTable"].Rows.Add(datarow);
                    }
                }
            }
            else
            {//如果不是第一周  直接从第一天加七天
                obj = date.AddDays(1 - date.Day);
                int week = (int)obj.DayOfWeek;
                if (week > 0) obj = obj.AddDays((n - 1) * 7 - week);
                else obj = obj.AddDays((n - 1) * 7);
                for (int i = 0; i < 7; i++)
                {
                    DateTime newObj = obj.AddDays(i);
                    if (newObj.Month != obj.Month) break;//如果已经到下个月了   停止填充  进行(1)的判断后 再填充空白所缺的天数
                    DataRow datarow = weekTable.NewRow();
                    datarow["week"] = i;
                    datarow["date"] = newObj;
                    ds.Tables["weekTable"].Rows.Add(datarow);
                }
                int count = ds.Tables["weekTable"].Rows.Count;//--------------(1)
                if (ds.Tables["weekTable"].Rows.Count < 7)
                {
                    for (int i = 0; i < 7 - count; i++)
                    {
                        DataRow datarow = weekTable.NewRow();
                        ds.Tables["weekTable"].Rows.Add(datarow);
                    }
                }
            }

            return ds.Tables[0];
        }
    }
}

repeater 控件是一个很灵活的东东,本人在程序开发中就最爱用到它了!!!
很多朋友应该在使用 VS2005 自带的 日历控件的时候 都发现或多或少的 不能满足自己的特殊需求

这个实例看似很简单  但如果能够家里改善 将能很好的运用到自己的程序当中(至少比用JS写个控件简单方便,还能很好的很数据库关联开发),本代码只粘贴出了日历的实现,实际上我用到了四个repeater 的嵌套 实现的是一个日程管理的系统, 剩下的和数据库有关联,所以删掉了!  希望对想使用日历控件的朋友有一定的帮助,注释写的很清楚了,朋友们可以随便改动 (程序有注释的,希望大家粘贴到VS 2005 中去看  很直观 很清楚的)

 

aspx 页面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test.Web._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 + n;
        }

    </script>
</head>
<body>
    <form />
    </form>
</body>
</html>

 

.CS文件

 

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Test.Web
{
    public partial class _Default : System.Web.UI.Page
    {
        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 obj = date.AddDays(1 - date.Day);//获取本月第一天

            int week = 1;
            for (int i = 1; i < 32; i++)
            {
                DateTime newDay = obj.AddDays(i);
                if (newDay.Month == obj.Month)//判断天数加一后的时间是否还在本月内
                {
                    if (newDay.DayOfWeek == 0) week++;//累加得到本月共有几周
                }
                else break;
            }

            DataSet ds = new DataSet();//创建一个dtatset 用来作为repeater 的数据源
            DataTable weekTable = new DataTable("weekTable");//创建一个dateTable 存放周表(即日历的行数)
            ds.Tables.Add(weekTable);
            weekTable.Columns.Add("id");
            weekTable.Columns.Add("Text");
            for (int i = 1; i <= week; i++)
            {
                DataRow datarow = weekTable.NewRow();
                datarow["id"] = i;
                datarow["text"] = "第" + i.ToString() + "周";
                ds.Tables["weekTable"].Rows.Add(datarow);
            }

            rptParent.DataSource = ds.Tables[0];//绑定第一个repeater  即日历的行数
            rptParent.DataBind();
        }

        protected void rptParent_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater 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)
            {
                //根据不同样式 设置 添加按钮 图片路径               
                HtmlImage img = (HtmlImage)e.Item.FindControl("imgAdd");
                if (DataBinder.Eval(e.Item.DataItem, "week") != System.DBNull.Value) {
                    DateTime newTime = Convert.ToDateTime((DataBinder.Eval(e.Item.DataItem, "date")));

                    if (newTime.Date == DateTime.Now.Date)
                    {
                        HtmlTable td = (HtmlTable)e.Item.FindControl("colorCell");
                        td.Attributes.Add("style", "background-color:#F9E97D;");
                    }
                }
            }
        }

        /// <summary>
        /// 获得本月 某一周的具体日期(不足七天的  比如第一周不是从周日开始的或者最后一周不是以周六结束的 )都以空时间 补充到 周详细表中
        /// </summary>
        /// <param name="n">本月的第几周</param>
        /// <returns>返回本月某一周的 具体 日期 的一个集合</returns>
        private DataTable GetWeekTable(int n)
        {
            DataSet ds = new DataSet();
            DataTable weekTable = new DataTable("weekTable");
            ds.Tables.Add(weekTable);
            weekTable.Columns.Add("week");
            weekTable.Columns.Add("date");
            weekTable.Columns[1].DataType = Type.GetType("System.DateTime");

            DateTime obj = new DateTime();
            if (n == 1)//如果是第一周
            {
                obj = date.AddDays(1 - date.Day);
                int week = (int)obj.DayOfWeek;
                if (week > 0)//如果不是周日 将补上空白
                {
                    for (int i = week - 1; i >= 0; i--)
                    {
                        DataRow datarow = weekTable.NewRow();
                        ds.Tables["weekTable"].Rows.Add(datarow);
                    }
                    for (int i = week; i < 7; i++)
                    {
                        DataRow datarow = weekTable.NewRow();
                        datarow["week"] = i;
                        datarow["date"] = obj.AddDays(i - week);
                        ds.Tables["weekTable"].Rows.Add(datarow);
                    }
                }
                else
                {//如果是周日  直接加上七天
                    for (int i = 0; i < 7; i++)
                    {
                        DataRow datarow = weekTable.NewRow();
                        datarow["week"] = i;
                        datarow["date"] = obj.AddDays(i);
                        ds.Tables["weekTable"].Rows.Add(datarow);
                    }
                }
            }
            else
            {//如果不是第一周  直接从第一天加七天
                obj = date.AddDays(1 - date.Day);
                int week = (int)obj.DayOfWeek;
                if (week > 0) obj = obj.AddDays((n - 1) * 7 - week);
                else obj = obj.AddDays((n - 1) * 7);
                for (int i = 0; i < 7; i++)
                {
                    DateTime newObj = obj.AddDays(i);
                    if (newObj.Month != obj.Month) break;//如果已经到下个月了   停止填充  进行(1)的判断后 再填充空白所缺的天数
                    DataRow datarow = weekTable.NewRow();
                    datarow["week"] = i;
                    datarow["date"] = newObj;
                    ds.Tables["weekTable"].Rows.Add(datarow);
                }
                int count = ds.Tables["weekTable"].Rows.Count;//--------------(1)
                if (ds.Tables["weekTable"].Rows.Count < 7)
                {
                    for (int i = 0; i < 7 - count; i++)
                    {
                        DataRow datarow = weekTable.NewRow();
                        ds.Tables["weekTable"].Rows.Add(datarow);
                    }
                }
            }

            return ds.Tables[0];
        }
    }
}

相关文章: