Calendar控件之DayRender事件

Calendar控件之DayRender事件

 

   DayRenderCalendar控件的一个相对重要的事件.它可以用来在Calendar控件中所有日期的长相”.这个事件使用了一个DayRenderEventArgs对象作为其参数.后者则包括两个属性:CellDay.MSDN,对于这两个属性有如下的描述:

 

属性

说明

Cell

获取表示呈现在 Calendar 控件中的单元格的 TableCell 对象

Day

获取表示呈现在 Calendar 控件中的日期的 CalendarDay

  下面运用它们来完成一些操作:

1).隐去Calendar控件中的非指定月的日期

以当前时间为例,即将月指定为DateTime.Now.Month.首先将Calendar控件的VisibleDate属性设置为DateTime.Now,然后再书写Calendar控件的DayRender事件,一种可能的书写方式如下:

 

/*Step1: Page_Load中设置Calendar控件的VisibleDate属性,或是通过IDE来设置,亦或是手动编写.aspx来完成*/

 

/*Step2: 撰写DayRender事件的处理*/

 

//声明一个变量,用来保存当前显示的月份

private int intCurrentMonth = DateTime.Now.Month;

private void Calendar1_DayRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e){

if(e.Day.Date.Month != intMonth) //如果不是指定的月份

         e.Cell.Text = "";              //将对应的TableCell对象的Text属性设置为””

}

 

这段代码可以很好地工作.运行后我们可以看到诸如下图的结果:

 

但是,如果Calendar控件上如果NextMonthText,PrevMonthText属性不为””的话,当点击它们的时候,由于前面的控制逻辑,可能会得不到期望的结果.比如:

2004-12

2005-1

 

而期望的结果是:

2004-12

2005-1

为了得到这个效果,我们可以使用Calendar控件的另一个事件PreRender.在这个事件中将变量intMonth设置为Calendar.VisibleDate.Month即可:

 

private void Calendar1_PreRender(object sender, System.EventArgs e){

    this.intMonth = this.Calendar1.VisibleDate.Month;

}

 

2)为特定的日期添加备注

为了完成对指定日期添加备注,可以首先抽象出一个class,比如DateMemo,用来记录对应某个日期的备注.具体来说,如下:

internal class DateMemo{

private DateTime dt;            //日期

       private string memo;            //对应备注

       //构造函数

public DateMemo(DateTime dt,string memo){

         this.dt = dt;

         this.memo = memo;

       }

//提供属性

public string Memo{

         get{

           return this.memo;      

         }

         set{

               this.memo = value;

         }

       }

 

public DateTime Date{

         get{

           return this.dt;

          }//Only getter, no setter

       }

};

 

//这个类并不完善,还可以覆写Equals,GetHashCode等基类方法

 

下面需要一个容器来存放需要添加备注的那些日期.当然,由于有了DateMemo,这个容器用来存储的对象就是DateMemo对象了.这里采用最简单的容器数组,即是DateMemo[]. 现在面临的一个问题是:从哪里获取这些DateMemo对象呢?其实,数据源是不拘的,从文件,数据库中提取都没有问题.为了突出主题,这里在程序中写死”:

private DateMemo[] data;           //存放DateMemo的数组

private string[] memo;              //日期的备注

 

private void Page_Load(object sender, System.EventArgs e){

if(!this.IsPostBack){ //首次加载

   this.Calendar1.VisibleDate = DateTime.Now;

          memo = new string[]{

                                            "Database exam",

                                      "Accomplish the book",

                                      "Body building",

                                      "Do Research work on neural network",

                                      "Having a face-to-face with English teacher",

                                           };

      //构建DateMemo数组,可以从其它数据源中加载,如此的话,可能不会使用到memo数组,请根据实际情况来完成加载

         data = new DateMemo[memo.Length];

         for(int i = 0; i < data.Length; i++)

               data[i] = new DateMemo(DateTime.Now.AddDays(i * 2),memo[i]);

         //DateTime.Now开始的连续data.Length个间隔为2天的日期设置为需要为其添加备注的日期

        }

}

 

//DayRender事件

private void Calendar1_DayRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e){

       /* 如果期望只显示当前月的日期,采用1)中的方法

    if(e.Day.Date.Month != intMonth)

                            e.Cell.Text = "";

       else {

*/

 // SpecialDayIndex是一个辅助函数,用来判断参数是否是一个需要添加备注的日期

        int index = this.SpecialDayIndex(e.Day.Date);

          if(index >= 0){

         //如果是需要添加备注的日期

         //在这里完成备注的添加动作

               e.Cell.BackColor = Color.FromName("Coral"); //设置Cell的背景色

               e.Cell.ToolTip = this.data[index].Memo;      //设置CellToolTip

     }

       /*

}

*/

}

 

其中, SpecialDayIndex的实现为:

//判断参数是否是一个需要添加备注的日期

//返回值:    -1     表示参数不是一个需要添加备注的日期

//       非负整数  表示参数是一个需要添加备注的日期,返回值为参数在data中的序号  

private int SpecialDayIndex(DateTime dt){

if(this.data == null) return -1;

int index = 0;

       foreach(DateMemo dm in this.data){

         if((dt.Year == dm.Date.Year) && (dt.Month == dm.Date.Month) && (dt.Day == dm.Date.Day)) //这里需要自己判断,不能使用(dt == dm.Date)或是(dt.Equals(dm.Date))

         return index;

        index++;

       }

return -1;

}

程序运行的一个结果如下:

 

    

其中,DateTime.Now2004-11-4,当把光标放在2004-11-8上时,显示了其对应的ToolTip.你可以设置其他属性.

 

你可能感兴趣的:(calendar,string,object,getter,setter,equals,ASP.NET)