Calendar控件之DayRender事件

这篇博客探讨了如何利用.NET Framework中的Calendar控件的DayRender事件来隐藏非指定月份的日期,并添加特定日期的备注。通过设置VisibleDate属性和处理DayRender事件,可以实现预期的显示效果。此外,通过创建DateMemo类并使用数组存储备注信息,可以为日历中的特定日期添加ToolTip显示备注。

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.你可以设置其他属性.
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值