思路:实现日期年月日的选择
1、可以设定年的起止年份
2、排除不正确日期选择的可能
3、使用javascript实现控制
4、使用Text属性方便获取设置日期值
=================================
代码如下:
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.IO;
using System.Text;
using System.Web.UI;
using System.Web.UI.Design.WebControls;
using System.Web.UI.WebControls;

namespace JSY
{
 /// <summary>
 /// AspNetDate 选择输入日期控件
 /// </summary> 
 [DefaultProperty("Text"),
  ParseChildren(false),
  PersistChildren(false),
  Description("专用于ASP.Net Web应用程序的日期控件"),
  Designer(typeof(DateDesigner)),
  ToolboxData("<{0}:JSYNetDate runat=server></{0}:JSYNetDate>")]
 public class JSYNetDate:Panel,INamingContainer,IPostBackDataHandler
 { 
  #region 属性
  /// <summary>
  /// 获取/设置日期值。
  /// </summary>
  [Bindable(true),
  Browsable(true),
  Description("日期值"),
  Category("外观"),
  DefaultValue("")]
  public string Text
  {
   get
   {
    if (ViewState["Text"] != null)
    {
     return ViewState["Text"].ToString();
    }
    else
    {
     if (IsNull)
     {
      return "";
     }
     else
     {
      DateTime date=System.DateTime.Today;
      string str="";
      switch (DateFormat)
      {
       case "YMD":
        str=date.ToString("yyyy-MM-dd",System.Globalization.DateTimeFormatInfo.InvariantInfo);
        break;
       case "YM":
        str=date.ToString("yyyy-MM",System.Globalization.DateTimeFormatInfo.InvariantInfo);
        break;
       case "Y":
        str=date.Year.ToString();
        break;
      }
      return str;
     }
    }
   }

set
   {
    if (value=="")
    {
     ViewState["Text"] = "";
    }
    else if (DateFormat=="YMD")
    {
     DateTime date;
     try
     {
      date=Convert.ToDateTime(value);
     }
     catch
     {
      date=System.DateTime.Today;
     }
     string str = date.ToString("yyyy-MM-dd",System.Globalization.DateTimeFormatInfo.InvariantInfo);
     if (str=="1900-01-01")
      str="";
     ViewState["Text"] =str;
    }
    else
    {
     ViewState["Text"] = value;
    }
   }
  }
  /// <summary>
  /// 获取/设置日期值是否允许空。
  /// </summary>
  [Browsable(true),
  Description("日期值是否允许空"),
  Category("布局"),
  DefaultValue(false)]
  public bool IsNull
  {
   get
   {
    return (ViewState["IsNull"]==null)?false:true;
   }
   set
   {
    if (value)
     ViewState["IsNull"]=true;
   }
  }
  /// <summary>
  /// 获取/设置日期值格式(YMD:年-月-日 YM:年-月 Y:年)。
  /// </summary>
  [Browsable(true),
  Description("日期值格式(YMD:年-月-日 YM:年-月 Y:年)"),
  Category("布局"),
  DefaultValue("YMD")]
  public string DateFormat
  {
   get
   {
    return (ViewState["DateFormat"]==null)?"YMD":(string)ViewState["DateFormat"];
   }

set
   {
    ViewState["DateFormat"]=value;
   }
  }
  /// <summary>
  /// 获取/设置日期值能否编辑。
  /// </summary>
  [Browsable(true),
  Description("能否编辑"),
  Category("行为"),
  DefaultValue(true)]
  public override bool Enabled
  {
   get
   {
    return (ViewState["Enabled"]==null)?true:false;
   }

set
   {
    if (!value)    
     ViewState["Enabled"]=false;
   }
  }
  /// <summary>
  /// 获取/设置日期值中可供选择的年份长度。
  /// </summary>
  [Browsable(true),
  Description("日期值中可供选择的年份长度"),
  Category("布局"),
  DefaultValue(100)]
  public int Length
  {
   get
   {
    object obj=ViewState["Length"];
    return (obj==null)?100:(int)obj;
   }

set
   {
    ViewState["Length"]=value;
   }
  }
  /// <summary>
  /// 获取/设置选择年份的结束值。
  /// </summary>
  [Browsable(true),
  Description("日期值中选择结束年份,当小于100时表示距今年数"),
  Category("布局"),
  DefaultValue(0)]
  public int End
  {
   get
   {
    object obj=ViewState["End"];
    int y;
    if (obj==null)
    {
     y=System.DateTime.Today.Year;
    }
    else
    {
     y=(int)obj;
     if (y<100)
     {
      y=System.DateTime.Today.Year+y;
     }
    }
    return y;
   }

set
   {
    ViewState["End"]=value;
   }
  }
  /// <summary>
  /// 获取选择年份的开始值。
  /// </summary>
  [Browsable(false),
  DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public int Start
  {
   get{return End-Length;}
  }

#endregion

#region 重写事件
  /// <summary>
  /// 重写OnLoad 方法。
  /// </summary>
  /// <param name="e">包含事件数据的 <see cref="EventArgs"/> 对象。</param>
  protected override void OnLoad(EventArgs e)
  {
   if (Page.IsPostBack)
   {
    string y=Page.Request.Form[this.UniqueID+"_year"];
    string m=Page.Request.Form[this.UniqueID+"_month"];
    string d=Page.Request.Form[this.UniqueID+"_day"];
    switch (DateFormat)
    {
     case "YMD":
      if (y=="" || m=="" || d=="")
      {
       Text="";
      }
      else
      {
       Text=y+"-"+m+"-"+d;
      }
      break;
     case "YM":
      if (y=="" || m=="")
      {
       Text="";
      }
      else
      {
       Text=y+"-"+m;
      }
      break;
     case "Y":
      if (y=="")
      {
       Text="";
      }
      else
      {
       Text=y;
      }
      break;
    }
   }
   base.OnLoad(e);
  }
  /// <summary>
  /// 重写<see cref="System.Web.UI.WebControls.WebControl.AddAttributesToRender"/> 方法,验证是否有form(runat=server)控件
  /// </summary>
  /// <param name="writer"></param>
  protected override void AddAttributesToRender(HtmlTextWriter writer)
  {
   if(this.Page!=null)
    this.Page.VerifyRenderingInServerForm(this);
   base.AddAttributesToRender(writer);
  }
  /// <summary>
  /// 重写<see cref="System.Web.UI.Control.OnPreRender"/>方法。
  /// </summary>
  /// <param name="e">包含事件数据的 <see cref="EventArgs"/> 对象。</param>
  protected override void OnPreRender(EventArgs e)
  {
   string

//原创:贾世义 日期:2005-08-16 免费共享 v1.0
//邮箱:
//请尊重版权,可以随意使用,但请注明出处//

function InitYear(pName,start,length,y)
{
  var selYear=eval('document.forms[0].'+pName+'_year');
  var n=selYear.length;
  selYear.length=n+length+1;
  for (i=0;i<=length;i++)
  {
 selYear.options[n+i].value=(i+start);
 selYear.options[n+i].text=(i+start);
  }
  if (y==0)
  {
 selYear.selectedIndex =0;
  }
  else
  {
 if (y>start)
 {
           if (y-start<=length)
    {
  selYear.selectedIndex = n+y-start;
    }
    else
   {
  selYear.selectedIndex = length;
   }
        }
  }
}

function InitMonth(pName,m)
{
  var selMonth=eval('document.all.'+pName+'_month');
  var n=selMonth.length;
  selMonth.length=n+12;
  for (i=1;i<10;i++)
  {
 selMonth.options[n+i-1].value='0'+i;
 selMonth.options[n+i-1].text=i;
  }
  for (i=10;i<=12;i++)
  {
 selMonth.options[n+i-1].value=i;
 selMonth.options[n+i-1].text=i;
  } 
  if (m==0)
  {
 selMonth.selectedIndex=0;
  }
  else
  {
 selMonth.selectedIndex = n+m-1;
  }
}

function InitDay(pName,d)
{
  var selDay=eval('document.all.'+pName+'_day');
  var n=selDay.length;
  selDay.length=n+31;
  for (i=1;i<10;i++)
  {
 selDay.options[n+i-1].value='0'+i;
 selDay.options[n+i-1].text=i;
  }
  for (i=10;i<=31;i++)
  {
 selDay.options[n+i-1].value=i;
 selDay.options[n+i-1].text=i;
  } 
  if (d==0)
  {
 selDay.selectedIndex = 0;
  }
  else
  {
 selDay.selectedIndex = n+d-1;
  } 
  dateChange(pName);
}

function dateChange(pName)
{
 var selYear=eval('document.forms[0].'+pName+'_year');
 var year=selYear.options[selYear.selectedIndex].value;
 if (year!='')
 {
  var selMonth=eval('document.all.'+pName+'_month');
  var month=selMonth.options[selMonth.selectedIndex].value;
  if (month!='')
  {
    var date=new Date(year,month,0);
    var day=date.getDate();
    var selDay=eval('document.all.'+pName+'_day');
    var tmp=1;
    if (selDay.selectedIndex>0)
    {
  tmp=selDay.options[selDay.selectedIndex].value;
    }
    selDay.length=day;
    for (i=1;i<10;i++)
    {
  selDay.options[i-1].value='0'+i;
  selDay.options[i-1].text=i;
    }
    for (i=10;i<=day;i++)
    {
  selDay.options[i-1].value=i;
  selDay.options[i-1].text=i;
    } 
    if (tmp>day)
    {
  selDay.selectedIndex=day-1;
    }
    else
    {
  selDay.selectedIndex=tmp-1;
    } 
  }
 }
}

</script>";
   Page.RegisterClientScriptBlock("EnableDays",strJS);
   base.OnPreRender(e);
  }
  /// <summary>
  /// 将此控件呈现给指定的输出参数。
  /// </summary>
  /// <param name="writer"> 要写出到的 HTML 编写器 </param>
  protected override void Render(HtmlTextWriter writer)
  {
   writer.Write("<table border='0' cellpadding='0' cellspacing='0'><tr><td nowrap align='left'>");
   int y=0;
   int m=0;
   int d=0;
   string str=Text;
   if (str.Length>=4)
   {
    y=Convert.ToInt32(str.Substring(0,4));
    if (str.Length>=7)
    {
     m=Convert.ToInt32(str.Substring(5,2));
     if (str.Length>=10)
     {
      d=Convert.ToInt32(str.Substring(8,2));
     }
    }
   }
   bool isDate=(DateFormat=="YMD");
   if (Enabled)
   {
    bool isNull=IsNull;
    writer.Write("<select name='"+this.UniqueID+"_year'");
    if (isDate)
    {
     writer.Write(" οnchange=\"dateChange('"+this.UniqueID+"')\"");
    }
    writer.Write(">");
    if (isNull)
    {
     writer.Write("<option value=''></option>");
    }
    writer.Write("</select>年");
    if (DateFormat.Length>1)
    {
     writer.Write("<select name='"+this.UniqueID+"_month'");
     if (isDate)
     {
      writer.Write(" οnchange=\"dateChange('"+this.UniqueID+"')\"");
     }
     writer.Write(">");
     if (isNull)
     {
      writer.Write("<option value=''></option>");
     }
     writer.Write("</select>月");
     writer.Write(@"
<script language='javascript'>
InitYear('"+this.UniqueID+"',"+Start.ToString()+","+Length.ToString()+","+y.ToString()+@");
InitMonth('"+this.UniqueID+"',"+m.ToString()+@");
</script>");
     if (isDate)
     {
      writer.Write("<select name='"+this.UniqueID+"_day'>");
      if (isNull)
      {
       writer.Write("<option value=''></option>");
      }
      writer.Write("</select>日");
      writer.Write(@"
<script language='javascript'>
InitDay('"+this.UniqueID+"',"+d.ToString()+@");
</script>");
     }
    }
   }
   else
   {
    if (y==0 || m==0)
    {
     writer.Write("&nbsp;");
    }
    else
    {
     writer.Write(y.ToString()+"年"+m.ToString()+"月");
     if (d!=0)
     {
      writer.Write(d.ToString()+"日");
     }
    }
   }
   writer.Write("</td></tr></table>");
  }

public event EventHandler TextChanged;

/// <summary>
  /// 当由类实现时,为 ASP.NET 服务器控件处理回发数据。
  /// </summary>
  /// <param name="postDataKey">控件的主要标识符</param>
  /// <param name="postCollection">所有传入名称值的集合</param>
  /// <returns>如果服务器控件的状态在回发发生后更改,则为 true;否则为 false。</returns>
  public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
  {
   String presentValue = Text;
   String postedValue = postCollection[postDataKey];

if (presentValue == null || !presentValue.Equals(postedValue))
   {
    Text = postedValue;
    return true;
   }

return false;
  }

/// <summary>
  /// 当由类实现时,用信号要求服务器控件对象通知 ASP.NET 应用程序该控件的状态已更改。
  /// </summary>
  public virtual void RaisePostDataChangedEvent()
  {
   OnTextChanged(EventArgs.Empty);
  }

protected virtual void OnTextChanged(EventArgs e)
  {
   if (TextChanged != null)
    TextChanged(this,e);
  }
  #endregion

}

[转贴]原创控件代码共享--日期选择控件相关推荐

  1. java 的日期选择控件_Java日期选择控件

    一起学习 一次项目研发中需要日期时间选择控件, 网上提供的不多, 且质量一般, 所以只好自己做,参考了 网上某位同学的 作品 Jave 日期选择控件 DateChooser . 目前的代码将日期时间选 ...

  2. 【C#】wpf自定义calendar日期选择控件的样式

    原文:[C#]wpf自定义calendar日期选择控件的样式 首先上图看下样式 原理 总览 ItemsControl内容的生成 实现 界面的实现 后台ViewModel的实现 首先上图,看下样式 原理 ...

  3. Swing的日期选择控件DatePicker

    Swing的日期选择控件 依赖的包 图片示例 示例代码段 设置日期控件的值 验证代码 结论 依赖的包 下载DatePicker.jar 图片示例 示例代码段 JLabel dateJLabel = n ...

  4. ExtJS6.0扩展日期选择控件为也可以选择时间

    PS:ExtJS自带的日期选择控件只能够选择日期,但是现在的需求需要精确到秒,所以在网上搜索了一些例子(大部分是4.0的)作为参考,然后改出了6.0可用的一个日期时间选择控件. 1.找到extjs6. ...

  5. java界面日期选择控件,JavaFX界面设计之时间选择器(1)

    本章我们主要介绍javafX时间选择器的使用,描述了DatePicker控件的基本特性. javaFX的DatePicker控件可以让我们从一个给定的日历中选择一天,主要用于网站或应用中需要用户输入一 ...

  6. js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件

    js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件 参考文章: (1)js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) ...

  7. [Ext JS 4] 实战之 带week(星期)的日期选择控件(三)

    前言 在 [Ext JS 4] 实战之 带week(星期)的日期选择控件(二) 的最后,有提到一个解决方案. 不过这方案有一个条件  ==> "2. 每年的周数从(1-52), 如果超 ...

  8. [Ext JS 4] 实战之 带week(星期)的日期选择控件(二)

    前言 JavaScript 中的日期和时间 [Ext JS 4] 实战之 带week(星期)的日期选择控件(一) 如对本篇的一些预备知识需详尽了解,可参考以上两篇. Javascript 有提供Dat ...

  9. extjs 月份选择控件_Ext JS 4实现带week(星期)的日期选择控件(实战二)

    前言 JavaScript 中的日期和时间 Ext JS 4实现带week(星期)的日期选择控件(实战一) 如对本篇的一些预备知识需详尽了解,可参考以上两篇. Javascript 有提供Date 对 ...

最新文章

  1. matplotlib画散点图
  2. 我的 atom 开发工具
  3. C语言strcat()库函数的实现
  4. 任正非:明年应届生招聘人数至少8000人
  5. php中超过int真么办,PHP int 超大溢出整数的 加减运算函数,如果有更好的方法欢迎探讨...
  6. python是哪个专业学的-专业python培训学校
  7. java中如何返回四维数组_如何从Java中的方法返回数组?
  8. 每一个tab切换的都是一个新的组件刷新
  9. python书籍_年度最多安利的10本Python书籍
  10. Android蓝牙开锁讲解
  11. 安装SqlServer 2016 2017 时,提示需要安装oracle JRE7 更新 51(64位)或更高版本
  12. Centos7安装iNode客户端
  13. Easyrecovery13 for mac 官方版下载
  14. 微软私有云服务器,微软私有云
  15. 计算机二级保存错地方,盘点考计算机二级那些容易出错的地方
  16. oracle 文本日期相减,日期相减等于整数的问题
  17. 电路设计_STM8S003F3P6 AWUADC使用小结
  18. 红蓝出屏3D图片,请使用红蓝眼镜观看
  19. mysql5.7 报错1055_MySql5.7 报错 1055
  20. 自动驾驶测试流程大全

热门文章

  1. python主线程和子线程_python 在threading中如何处理主进程和子线程的关系
  2. react打包服务器文件,react项目搭建及打包发布
  3. android.mk 编译jar包,Androidmk 使用详解
  4. 实现自己的类加载时 重写方法loadClass与findClass的区别
  5. Python编程基础11:字典
  6. Java案例:自动点名程序
  7. 【BZOJ2809】【codevs1763】派遣,主席树记录前缀和
  8. cssbefore图片大小_我可以在CSS:before /:after伪元素中更改图像的高度吗?
  9. 2017.4.21 螺旋矩阵 思考记录
  10. 中南大学计算机院转专业要求,机电工程学院2018级本科学生转专业的实施细则...