帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程 >
为你的Blog打造个性日历控件
作者:devercn 发布时间:2005-03-12 来源:ASPCOOL
     历控件是dotnet自带的控件之一,功能强大,在很多项目开发中都有用到,对于blog系统来说更是必不可少。纵是好玉也仍需雕琢,为了使它更美观实用,我们还需要对它进行二次开发。
  
  第一步是外观设置,这个根据你的需要,只需对它的相关属性做一些调整即可。下图是我调整后的界面
  
  属性设置如下:<asp:calendar id="Calendar1" CellPadding="2" Width="160px" TitleStyle-BackColor="#000000" BorderColor="#aaaaaa"
   DayHeaderStyle-BackColor="#5e715e" OtherMonthDayStyle-ForeColor="#cccccc" DayNameFormat="Full"
   runat="server" TitleStyle-ForeColor="#ffffff" NextPrevStyle-ForeColor="#ffffff" CellSpacing="1"
   WeekendDayStyle-BackColor="#eeeeee" DayHeaderStyle-ForeColor="#ffffff" SelectionMode="None"
   TodayDayStyle-BorderColor="#5e715e" TodayDayStyle-BorderWidth="1" TodayDayStyle-Font-Bold="true"
   TodayDayStyle-ForeColor="#5e715e">
  
  第二步是对内部功能的调整,这个工作主要集中在以下两个事件的处理上。
  
  PreRender:当服务器控件将要呈现给其包含的Page对象时发生。
  
  DayRender:当为Calendar控件在控件层次结构中创建每一天时发生。
  
  先定义三个整型变量和整型数组
   private int[] arrCurrentDays,arrPreDays,arrNextDays; //三个变量分别是当前月,前一月,和下一个月
   private int intCurrentMonth,intPreMonth,intNextMonth; //三个整型数组存放相对月份写有blog的日期
   protected System.Web.UI.WebControls.Calendar Calendar1; //这个就是我们的日历控件了
  
   2. 下面我将分别给出这两个事件的源码,并在下面解释它实现的功能,如果你看不明白,可以先看下面的说明
  
  PreRender
   private void Calendar1_PreRender(object sender, System.EventArgs e)
   {
   Thread threadCurrent = Thread.CurrentThread;
   CultureInfo ciNew = (CultureInfo)threadCurrent.CurrentCulture.Clone();
   ciNew.DateTimeFormat.DayNames = new string[]{"日","一","二","三","四","五","六"};
   ciNew.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Sunday;
   threadCurrent.CurrentCulture = ciNew;
   }
  
  以上代码改变了星期名称的显示。你只需改变字符数组的值就能改名称显示。
  
  DayRender
  private void Calendar1_DayRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e)
   {
   //该控件在创建每一天时发生。
  
   CalendarDay d = ((DayRenderEventArgs)e).Day;
   TableCell c = ((DayRenderEventArgs)e).Cell;
  
   // 初始化当前月有Blog的日期数组
   if( intPreMonth == 0 )
   {
   intPreMonth = d.Date.Month; // 注意:日历控件初始化时我们得到的第一个月并不是当前月,而是前一个月的月份
   intCurrentMonth = intPreMonth+1;
     if (intCurrentMonth>12)
   intCurrentMonth=1 ;
   intNextMonth = intCurrentMonth+1;
   if (intNextMonth >12)
   intNextMonth =1;
   arrPreDays = getArrayDay(d.Date.Year,intPreMonth); //得到前一个月有blog的日期数组
   arrCurrentDays = getArrayDay(d.Date.Year,intCurrentMonth) ;//得到当月有blog的日期数组
   arrNextDays = getArrayDay(d.Date.Year,intNextMonth) ;//得到下个月有blog的日期数组
   }
  
   int j=0;
  if( d.Date.Month.Equals(intPreMonth) )
   {
   while( ! arrPreDays[j].Equals(0) )
   {
   if(d.Date.Day.Equals(arrPreDays[j]))
   {
   c.Controls.Clear();
   c.Controls.Add(new LiteralControl("<a href=day.aspx?year="+d.Date.Year+"&month="+
   d.Date.Month+"&day="+d.Date.Day+">"+d.Date.Day+"</a>"));
   }
   j++;
   }
   }
   else if( d.Date.Month.Equals(intCurrentMonth) )
   {
   while( ! arrCurrentDays[j].Equals(0) )
   {
   if(d.Date.Day.Equals(arrCurrentDays[j]))
   {
   c.Controls.Clear();
   c.Controls.Add(new LiteralControl("<a href=day.aspx?year="+d.Date.Year+"&month="+
   d.Date.Month+"&day="+d.Date.Day+">"+d.Date.Day+"</a>"));
   }
   j++;
   }
   }
   else if( d.Date.Month.Equals(intNextMonth) )
   {
   while( ! arrNextDays[j].Equals(0) )
   {
   if(d.Date.Day.Equals(arrNextDays[j]))
   {
   c.Controls.Clear();
   c.Controls.Add(new LiteralControl("<a href=day.aspx?year="+d.Date.Year+"&month="+
   d.Date.Month+"&day="+d.Date.Day+">"+d.Date.Day+"</a>"));
   }
   j++;
   }
   }
  }
  
  日期控件一个页面能显示三个月份的日期,当前月是完整的,前一月和下一月有部分日期。DayRender事件会初始化具体日期的显示方式,在这里我们要对有blog内容的日期加上超级链接。于是我们需要在初始化时得到三个数组,数组里分别存放连续三个月的写有blog的日期。然后依次与当前日期比较,相同则加上链接。
  
  在使用DayRender事件时,你一定不要忘了它是在每个日期初始化时执行一次,这就意味着初始化一次日历控件这个事件就要执行42次,所以要尽可能的简化操作,更不要不加判断的进行重复的数据库操作,我刚开始时没注意,在该事件里写了两个读库语句,结果严重影响性能。
  
  下面这个方法是我用来获得日期数组的。
  // 得到该月有blog的日期数组
   private int[] getArrayDay(int intYear,int intMonth)
   {
   int[] intArray = new int[31];
   //从数据库里选取符合要求的记录,将日期存入数组
   string strSql = "select content_time from content where year(content_time)="+intYear+
   " and month(content_time)="+intMonth;
   dr = SqlHandle.GetDr(strSql);
   while(dr.Read())
   {
   if( i==0 )
   {
   intArray[i] = dr.GetDateTime(0).Day;
   i++;
   }
   else if( dr.GetDateTime(0).Day != intArray[i-1] )
   {
   intArray[i] = dr.GetDateTime(0).Day;
   i++;
   }
   }
   dr.Close();
   return intArray;
   }
  
  具体的使用效果可以去我的blog看: www.dever.cn
  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·J2EE如何为你的企业做嫁衣  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·放眼未来 帝国近期将有重大举措!
·PHPWind6.3.2版通行证发布
·帝国备份王2008版正式发布
·帝国备份王2008版发布
·phpcms2007转帝国CMS5.0程序发布
·dedecms5.1转帝国CMS5.0程序发布
·帝国网站管理系统V5.0商业购买说明
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统