asp.net日程控件:利用ASP.NET日期Control控件制作 会议日程安排 (来源: 发布时间:星期六, 2009年3月28日 浏览:0次 评论:0
大家应该比较熟悉outlook里日程安排点进去就是个日历版面选择某日即可添加当天日程安排还有偶尔玩下开心网兄弟们应该也知道有个日程组件其实和outlook有点兄弟关系只不过比outlook做要漂亮些:) 从VS03到VS08里ASP.NET直带有个Calendar日历Control控件我不知道历经 3代岁月沧桑交替这个Control控件发生了多少变化不是很清楚从来就没在项目中用过最近个项目倒是提到了这方面需求要求用户登录点“会议日程”能显示当前月日期和相应具体日期有哪些事情等...... 首先看下面个图然后依此慢慢详述: 这个是运行系统原图下面具体介绍说明下用ASP.NET日历Control控件来重新完成这功能完整demo在文章最后有链接地址供下载 CalendarControl控件有个DayRender事件即是在呈现日时激发我们处理代码必须写在这个事件下才行只有这样才能保证在呈现某个日时从数据库加载相应日程安排来重绘当前日历Control控件日日 首先定义两个维(当然也可以定义个 2维)个记录当前月中日个几个当前月中日对应会议标题如 Array = [999]; title = [999]; 假设选中是12月份从数据库取出数据可能是这样Array [0] = 2Array [1] = 2,Array [3] = 5等 对应标题就是这样 title[0] = "上午10点开会" title [1] = "下午XX需求讨论" title [2] = "客户系统演示"(没有日程安排日那么Array [i] = 0,后面跳出循环依据正式根据该项值是否为0来判断) 这个表示12月2日有两项会议日程安排12月5日有项日程安排这里我定义长度为999相当于每月平均每天30多次会议般也不会到这个数了呵呵如果从数据库读出当月会议项次超出999次当然会报异常这里当然也是可以从数据库动态读实际必要性也不是很大吧 添加日程安排时候可以选择跨天数但不允许跨月(如果要跨月不是不可以日期拆分上要再作下处理只是这个主要用来安排某日议程必要性不是很大)比如选择2008-12-1 至 2008-12-3 添加条日程安排日历呈现时会拆分成 3条数据分别对应123号表示该 3天都有同件会议安排下面是添加日程截图: 数据库字段为 [PLAN_ID][PLAN_TITLE][PLAN_CONTENT][START_DATE][END_DATE][CREATE_DATE][UPDATE_DATE] 根据日期安排开始时间年和月来查找出当前年当前月日程记录最终返回个日期和包括个引用类型标题思路方法如下: /**////<summary> ///返回日期 ///</summary> ///<paramname="Year"></param> ///<paramname="Month"></param> ///<paramname="title"></param> ///<s></s> publicList<>GetList(Year,Month,outList<>title) { //Array=[999]; //title=[999]; List<>Array=List<>([999]);//设定个月最多999次会议当然也可以通过数据库记录动态赋值即下面i值 title=List<>([999]); //从数据库里选取符合要求记录将日期存入(即符合所选当前年当前月所有会议记录) StringBuilderstrSql=StringBuilder; strSql.Append("SELECTPLAN_TITLE,START_DATE,END_DATE"); strSql.Append("FROMWORK_PLAN"); strSql.Append("WHEREDATEPART(year,START_DATE)="+Year); strSql.Append("ANDDATEPART(month,START_DATE)="+Month); i=0; planName=.Empty; SqlDataReaderdr=null; try { dr =DataAccess.ExecuteSqlReader(conn,CommandType.Text,strSql.,null); while(dr.Read) { DateTimesdate=DateTime.Parse(dr["START_DATE"].); DateTimeedate=DateTime.Parse(dr["END_DATE"].); planName=dr["PLAN_TITLE"].; (sdateedate)//如果该会议安排没有跨天数 { Array[i]=sdate.Day; title[i]=planName; i; } (sdate<edate)//跨天数(仅当前月内)如11日12日都安排该日程则在日历Control控件呈现时12日12日都会显示改会议日程安排 { for(j=0;j<=edate.Day-sdate.Day;j) { Array[i]=sdate.Day+j; title[i]=planName; i; } } } Array; } catch(.Exceptionex) { throwex; } finally { dr.Close; conn.Close; } } 接下来就是加载呈现WEB页面日历Control控件操作先定义相关变量 // 3个变量分别是当月天前月天和下月天 //privatearrCurrentDays,arrPreDays,arrNextDays; privateList<>arrCurrentDays;//,arrPreDays,arrNextDays; // 3个整型存放相对月份写有plan日期 privateCurrentMonth,PreMonth,NextMonth; //planName=[999];//在日期下面显示有会议安排标题名称 List<>planName;//在日期下面显示有会议安排标题名称 planTitle=.Empty;//当前日所有标题拼接成个串 DayRender事件里每读到个日就会执行次加载时读到第个月并不是当前月而是当前月上个月 如果把日历Control控件看成 2维话是5X7( 2月有时是4X7马上新年好像就是呵呵)个月最多只有31天 所以每个次日历Control控件日期呈现至少会出现两个月代码贴在下面好了也都有注释 protectedvoidCalPlan_DayRender(objectsender,DayRenderEventArgse) { CalendarDayd=((DayRenderEventArgs)e).Day; TableCellc=((DayRenderEventArgs)e).Cell; (PreMonth0) { //日历Control控件化时取得是第个月并不是当前月而是前个月月份 PreMonth=d.Date.Month; CurrentMonth=PreMonth+1; (CurrentMonth>12) CurrentMonth=1; NextMonth=CurrentMonth+1; (NextMonth>12) NextMonth=1; //得到前个月有plan日期 //arrPreDays=getArrayDay(d.Date.Year,PreMonth); //得到当月有plan日期 arrCurrentDays=getArrayDay(d.Date.Year,CurrentMonth); //得到下个月有plan日期 //arrNextDays=getArrayDay(d.Date.Year,NextMonth); } strDate=d.Date.Year+"-"+d.Date.Month+"-"+d.Date.Day; title=d.Date.Month.+"月"+d.Date.Day.+"日";//鼠标移上时显示相应月日 c.Controls.Clear;//绘制前先清除 //打开新窗口传递参数. c.Controls.Add(LiteralControl("<ahref='#'onclick=javascript:OpenWin('ViewPlan.aspx?PlanDate="+strDate+"'"+",650,750,50,200)title='"+title+"'>"+d.Date.Day+"</a>")); j=0; Rownum=0; (d.Date.Month.Equals(PreMonth)) { c.Controls.Clear;//让上月日期不可见 //while(!arrPreDays[j].Equals(0)) //{ //(d.Date.Day.Equals(arrPreDays[j])) //{ ////放置逻辑处理 //} //j; //} } (d.Date.Month.Equals(CurrentMonth)) { title=d.Date.Month.+"月"+d.Date.Day.+"日";//鼠标移上时显示相应月日 //IEnumerable<>Days=fromdayinarrCurrentDays //whereday!=0&&d.Date.Dayday //selectday; // //foreach(ddinDays) //{ //Rownum; //planTitle"("+Rownum.+")"+planName[x]+"<br/>";//如果能取到索引值可以使用下LINQ语句像上面那样 //c.Controls.Clear; //c.BorderWidth=1; //c.BorderColor=.Drawing.Color.Red; //c.BackColor=.Drawing.Color.Pink; //c.Controls.Add(LiteralControl("<ahref='#'onclick=javascript:OpenWin('ViewPlan.aspx?PlanDate="+strDate+"'"+",650,750,50,200)title='"+title+"'><fontcolor='blue'size='3'>"+d.Date.Day+"<font><br/><divstyle='text-align:left'><fontcolor='blue'size='2'>"+planTitle+"<font></div></a>")); //} //=若当月会议次数为N当月天数为M则循环执行M*N次=// while(!arrCurrentDays[j].Equals(0))//没有会议对应值即为整型默认值0 { (d.Date.Day.Equals(arrCurrentDays[j]))//判断当前日期第几天是否于 { Rownum; planTitle"("+Rownum.+")"+planName[j]+"<br/>";//标题索引和天索引是对应 c.Controls.Clear; //当前月有会议安排日期并设置相应字体格式于样式 c.BorderWidth=1; c.BorderColor= .Drawing.Color.Red; c.BackColor=.Drawing.Color.Pink; c.Controls.Add(LiteralControl("<ahref='#'onclick=javascript:OpenWin('ViewPlan.aspx?PlanDate="+strDate+"'"+",650,750,50,200)title='"+title+"'><fontcolor='blue'size='3'>"+d.Date.Day+"<font><br/><divstyle='text-align:left'><fontcolor='blue'size='2'>"+planTitle+"<font></div></a>")); } j; } //每次循环后清空变量 planTitle=.Empty; } (d.Date.Month.Equals(NextMonth)) { c.Controls.Clear;//让下月日期不可见 //while(!arrNextDays[j].Equals(0)) //{ //(d.Date.Day.Equals(arrNextDays[j])) //{ //放置逻辑处理 //} //j; //} } } 按上面再解释下(其中有些作了注释就不多说了也有个别问题注释里也说了当然可以改进)个空日历Control控件在WEB页面上浏览时 鼠标移上去会有日期提示但是每次重绘当前日时必须要清空不然日期数字会重叠重绘了就不会有鼠标移上去提示效果 和普通href链接样重加个title属性就可以了如果只想让当前月日期可见上月和下月日期不可见可以在加载时作下判断 如果是上月或下月就作个清空处理(如果要显示上下月日程记录要在日期返回前作处理了本例中日期只返回当前月日 并没有上月和下月会议日程记录)输出格式不作处理话都是剧中显示所以手动加了个样式把当前日会议标题作为个整串 加上链接转到详细也传递当前日作为参数就可以了详细显示也就不多说了详细页查看日程记录在实际项目应用中可以和用户关联 当前用户只可以可以编辑自己日程安排和查看所有日程安排(事实项目中也正是这么用)代码在下面下载好了要测试话把建表脚本跑下 (下载包里)就个表部分代码是从项目中COPY出来重新整理了下可以单独运行是VS08项目VS05可能打不开 不过把要用代码直接COPY到05里也样可以运行最好把测试运行效果图截两张 到此结束谢谢观赏 :) 实在没什么含量看具体情况用用了 呵呵 决定还是放到首页过把瘾 赶上今天个特殊天 兄弟们辛苦了 预祝圣诞快乐~~ 0
相关文章
读者评论发表评论 |
|