我想做一个自定义的日历控件,就是把星期五、星期一等换成“”一、“五”等。看了网上广为流传的“为你的Blog打造个性日历控件”一文,开始学着做。
1、新建项目,添加Web自定义控件,在页面上添加一个日历控件。
2、在代码中加入PreRender和DayRender事件。编译。
3、在要包含自定义日历控件的页中引用上面新建的项目,在ASPX页中加上注册项,在页面的合适位置添加控件。在上述过程中,编译成功过一次,不过执行页面时出现了找不到自定义日历控件的DayRender 和PreRender事件的提示,具体忘了,意思是在当前页面中找不到,可这两个事件是在ASCX.CS里面的啊。以后出的错是:“虚拟路径“/CustomCalendar.ascx”映射到另一个应用程序,这是不允许的。”我要是不把此自定义日历控件放在一个新项目里,还怎么实现控件重用呢?

解决方案 »

  1.   

    自定义日历控件代码如下:
    !!!!!CustomCalendar.ascx的内容:
    <%@ Control Language="c#" AutoEventWireup="false" Codebehind="CustomCalendar.ascx.cs" Inherits="Component.CustomCalendar" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
    <asp:Calendar ID="myclndr" Runat="server"></asp:Calendar>
    CustomCalendar.ascx.cs
    !!!!!CustomCalendar.ascx.sc的内容:
    namespace Component
    {
    using System;
    using System.Data;
    using System.Drawing;
    using System.Globalization;
    using System.Threading;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls; /// <summary>
    /// CustomCalendar 的摘要说明。
    /// </summary>
    public class CustomCalendar : System.Web.UI.UserControl
    {
    protected System.Web.UI.WebControls.Calendar myclndr; private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器
    /// 修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.myclndr.DayRender += new System.Web.UI.WebControls.DayRenderEventHandler(this.myclndr_DayRender);
    this.myclndr.PreRender += new System.EventHandler(this.myclndr_PreRender);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void myclndr_PreRender(object sender, System.EventArgs e)
    {
    Thread threadDQ=Thread.CurrentThread;
    CultureInfo cltnf=(CultureInfo)threadDQ.CurrentCulture.Clone();
    cltnf.DateTimeFormat.DayNames=new string[]{"日","一","二","三","四","五","六"};
    cltnf.DateTimeFormat.FirstDayOfWeek=DayOfWeek.Sunday;
    threadDQ.CurrentCulture=cltnf;
    } private void myclndr_DayRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e)
    {
    CalendarDay d=((DayRenderEventArgs)e).Day;
    TableCell c=((DayRenderEventArgs)e).Cell;
    }
    }
    }!!!!!使用该控件的页面的注册值:
    <%@ Register TagPrefix="Component" TagName="CustomCalendar" Assembly ="Component" Src="\CustomCalendar.ascx"%>
    !!!!!引用语句:
    <Component:CustomCalendar id="myClndr" runat="server"></Component:CustomCalendar>
      

  2.   

    因为在你代码中的“web窗体设计器生成的代码”中没有引入函数PreRender两个方法解决:
    一)点击日历控件,在“事件”窗口中的杂项PreRender中引入那个函数名称PreRender,编译后就自动引入了。二)不需要在“web窗体设计器生成的代码”中引入,在calendar控件中加一句OnPreRender=PreRender,不过这时你可能要将PreRender函数设为protected
      

  3.   

    fjbolo(菠萝一派——www.jworldnet.com) :
    你说的方法是在自定义控件所在的ascx呢,还是在使用它的aspx中?
      

  4.   

    应该是在自定义控件所在的ascx里面,但是我做的时候没有用自定义控件,直接在页面中将calendar拖到需要的地方,然后就改代码了。我觉得没必要做成用自定义控件。你自己都试试把,应该都可以的。
      

  5.   

    我现在也是这样做的。我感觉两种方式都差不多,一样麻烦,还不是粘贴、复制!
    不过看过一篇asp.net10大不良习惯(很容易搜到的),说不会用自定义控件就是不会asp.net,才有学他的想法的。
      

  6.   

    有关自定义控件其实要具体情况具体分析,我一般是在做一个比较复杂的控件或者要在好几个页面调用的,那就会单独做一个自定义控件。我对楼主的建议是:在实践中自己多多摸索,一定要多练,不必太多拘泥于网上说的所谓的套路,写程序也是要写出个性来的。
    本人最近网站改版,在做一个自己的博客站点,所以在网上查了一下资料,也看到了楼主讲到的“为你的Blog打造个性日历控件”一文,自己试着做了一下,的确受益匪浅,不过其中一些东西我觉得没有必要做的那么麻烦。如果楼主需要可以到我网站留下联系方式,或者直接发邮件到[email protected],我可以把我现在做的日历控件源码发给你。
      

  7.   

    VS.NET2005里已经解决了中文日历标头的这个问题。