Calendar控件之DayRender事件
DayRender是Calendar控件的一个相对重要的事件.它可以用来在Calendar控件中所有日期的”长相”.这个事件使用了一个DayRenderEventArgs对象作为其参数.后者则包括两个属性:Cell和Day.在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; //设置Cell的ToolTip } /* } */ } |
其中, 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;} |