Calendar控件之DayRender事件_calendar1_dayrender_St0ne82的博客-程序员秘密

技术标签: calendar  getter  string  equals  ASP.NET  setter  object  

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.你可以设置其他属性.

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/St0ne82/article/details/167728

智能推荐

[JS 工具] 格式化显示 mailman 上的 diff 文本_weixin_30263073的博客-程序员秘密

公司使用 mailman 来显示 patch,mailman 显示的改动只有一堆黑白文字,难以辨认。有时候还把 patch 当成文件再 git add 一遍后再生成一个新的 patch,这时候对于原来 patch 的代码改动来说,整个 patch 都是新增代码,就更加难以看出改动在哪,给 review patch 带来不必要的不便。有天我想可不可以做成跟 github 一样,至少增删有不...

Basler相机外部触发硬件设置_台达as228t接线图_ilovelab的博客-程序员秘密

1、相机硬件接线图参考链接:https://wenku.baidu.com/view/dcc580e579563c1ec4da7168.html

【操作系统笔记】_cpu硬盘内存可以被互斥共享吗_都卜冰的博客-程序员秘密

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录2.操作系统2.1 操作系统包括哪些重要部分。2.2 OS系统特点2.2 BIOS是什么,在OS中什么用途。2.3 微内核是什么。按了开机键后电脑的启动过程。2.4 并发&amp;并行2.5 同步&amp;异步2.6 进程通信挂起态2.7 进程和线程区别2.8 互斥锁、自旋锁、读写

【联邦学习FATE框架实战】(一)FATE1.6单机部署教程_fate jupyternotebook_HarrisonWu42的博客-程序员秘密

目录1. 说明2. 安装前3. 在主机中安装FATE(使用已编译的安装包)3.1 端口检查3.2 获取安装包3.3 安装3.4 启动3.5 测试3.6 FATE Board4. 安装FATE-Client、FATE-Test、FATE-Flow、jupyter notebook4.1 FATE-Client、FATE-Test4.2 FATE-Flow4.3 FATE中的Jupyter Notebook1. 说明使用虚拟机VMware进行实验,实验过程中随时拍摄快照,节约重装时间。项目Val

MSTP 解决链路负载均衡与链路检测_shrun的博客-程序员秘密

MSTP 解决复杂情况下的链路负载均衡与链路检测

Android播放声音SoundPool、MediaPlayer、AudioTrack_郭风朴的博客-程序员秘密

Android平台中关于音频播放有以下三种方式:    1.SoundPool ---- 适合短促且对反应速度比较高的情况(游戏音效或按键声等)   2.MediaPlayer ---- 适合比较长且时间要求不高的情况   3.AudioTrack ---- 播放解码后的PCM码流 方法一:SoundPool1)SoundPool简介        SoundPoo

随便推点

腾讯副总裁曾宇:谈谈腾讯的技术价值观与技术人才修炼_腾讯曾宇_CG国斌的博客-程序员秘密

作者简介:曾宇先生,腾讯公司副总裁。 2002 年加入腾讯,曾负责腾讯研发线管理,后续担任互动娱乐事业群研发部总经理,负责游戏、互娱相关的技术研发及管理工作,2012 年升任公司 VP,16 年起主要负责移动互联网事业群技术管理工作,继续参与公司级技术管理工作。正文技术人员的核心素养腾讯的职业发展通道大概有 6 级,1 级是初入者,2 级是有经验者,3 级是骨干,4 级是专家,5 级和 6 级是权

C#编程利器之三:接口(Interface)_cuibinmo3519的博客-程序员秘密

C#接口是一个让很多初学者容易迷糊的东西,用起来好象很简单,定义接口,然后在里面定义方法,通过继承与他的子类来完成具体的实现。但没有真正认识接口的作用的时候就觉得用接口是多此一举,当然你这样想是绝对错误的。在软件设计中...

问题:CentOS7 虚拟机每次启动后网卡是关闭状态_虚拟机为什么三台网卡都自己关闭了_竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。的博客-程序员秘密

发现问题: 问题:CentOS7 虚拟机每次启动后网卡是关闭状态 解决方案: 1、检查虚拟机设置网卡启动时自动连接 2、检查网卡是否打开onboot选项 3、关闭NetworkManager CentOS6: # chkconfig NetworkManager off 用来永久关闭,生产环境常禁用状态 CentOS7: ...

三维空间圆弧拟合-原创_linuxarmsummary的博客-程序员秘密

在数控插补中,实现空间圆弧轨迹是比较困难的~。最近在做运动控制。要实现空间圆弧插补。想的头都大了~平面圆弧中。只要三个点就能确定一个圆,求出半径,圆心。所以我就用拟合平面圆弧的方法。进行两次拟合得到空间圆弧的轨迹。比如在空间得到三个点a(x,y,z) b(x,y,z)c(x,y,z);先对xy平面进行拟合圆然后对xz平面拟合圆。xy拟合坐标为XY坐标xz拟合坐标为Z坐标。这样空

在linux上发布服务,由于监听端口的地址填写了127.0.0.1,所以请求不到服务_组播绑定127.0.0.1搜不到_Walker_zmc的博客-程序员秘密

127.0.0.1和0.0.0.0地址的区别1. 问题引入之前在使用tomcat的时候,启动tomcat默认都会绑定到127.0.0.1这个地址,最近在使用hexo写博客的时候发现通过 hexo server命令启动服务的时候绑定的ip地址是0.0.0.0。那么这两个IP地址到底有什么不同呢?在讲解两个地址的不同之前,我们先回顾一下IP地址的基础知识。2. IP地址分类2.1 ...

推荐文章

热门文章

相关标签