分类: ASP.NET/C#2007-04-16 09:20 518人阅读 评论(0) 收藏 举报

由3个dropdownlist组成的选择日期控件
可以设置相应属性

代码如下:

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 AppCode
{
    /// <summary>
    /// AspNetDate 选择输入日期控件
    /// </summary>
    [DefaultProperty("Text"), 
    ParseChildren(false),
    PersistChildren(false),
    Description("专用于ASP.Net Web应用程序的日期控件"),
    Designer(typeof(DateDesigner)),
    ToolboxData("<{0}:WSCDate runat=server></{0}:WSCDate>")]
    public class WSCDate: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>
    /// 服务器控件设计器。
    /// </summary>
    public class DateDesigner:System.Web.UI.Design.WebControls.PanelDesigner
    {
        /// <summary>
        /// 初始化 PagerDesigner 的新实例。
        /// </summary>
        public DateDesigner()
        {
            this.ReadOnly=true;
        }
        private WSCDate wb;

        /// <summary>
        /// 获取用于在设计时表示关联控件的 HTML。
        /// </summary>
        /// <returns>用于在设计时表示控件的 HTML。</returns>
        public override string GetDesignTimeHtml()
        {

            wb=(WSCDate)Component;
            wb.Text="";
            StringWriter sw=new StringWriter();
            HtmlTextWriter writer=new HtmlTextWriter(sw);
            wb.RenderControl(writer);
            return sw.ToString();
        }

        /// <summary>
        /// 获取在呈现控件时遇到错误后在设计时为指定的异常显示的 HTML。
        /// </summary>
        /// <param name="e">要为其显示错误信息的异常。</param>
        /// <returns>设计时为指定的异常显示的 HTML。</returns>
        protected override string GetErrorDesignTimeHtml(Exception e)
        {
            string errorstr="创建控件时出错:"+e.Message;
            return CreatePlaceHolderDesignTimeHtml(errorstr);
        }
    }
    #endregion
}

使用方法:在asp.net 页中加入

<%@ Register TagPrefix="cc1" Namespace="AppCode" Assembly="AppCode" %>

<cc1:wscdate id="WSCDate1" runat="server" IsNull="False" Length="46" End="2050" Wrap="False"></cc1:wscdate>

专用于ASP.Net Web应用程序的日期控件的更多相关文章

  1. asp.net asp.net application 升级到 asp.net web 解决找不到控件 批量生成.designer文件

    颇费周折后,其实很简单,只需要生成designer文件后,重新保存所有页面即可.就是懒得写.懒真的是一种病,手上不能懒,脑子里更不能懒,否则就是给自己挖坑,仔细认真,注意细节!!!! PS:注意修改p ...

  2. Visual Studio中用于ASP.NET Web项目的Web服务器

    当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Expr ...

  3. Asp.NetCore Web应用程序中的请求管道和中间件

    你是否会迷惑当我们请求一个ASP.NetWeb应用程序以后,它是怎么处理这些请求的,后台是怎么工作的,今天就讲一下Asp.NetCore Web应用程序中的请求处理过程. 上一节,我们讲到,Start ...

  4. ASP.NET Web 应用程序及页面生命周期

    以客户端浏览器向 ASP.NET Web 应用程序页面发送请求(Request)为起点,以浏览器收到 Web 服务器的响应(Response)为终点,这一完整的过程被称为"应用程序及页面的生 ...

  5. 配置ASP.NET Web应用程序, 使之运行在medium trust

    这文章会向你展示, 怎么配置ASP.NET Web应用程序, 使之运行在medium trust.   如果你的服务器有多个应用程序, 你可以使用code access security和medium ...

  6. asp.net 网站和asp.net Web 应用程序的一处不同

    环境为:VS2008Team+.net3.5 asp.net 网站前台页面<%= %>这样绑定可以,asp.net Web 应用程序就不可以 示例代码如下: 1.asp.net网站 < ...

  7. Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架

    Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 历史 Bootstrap 是由 Twitter 的 ...

  8. ASP.NET Web安装程序

    键发布ASP.NET Web安装程序,搞WebForm的童鞋看过来... 前言:最近公司有个Web要发布,但是以前都是由实施到甲方去发布,配置,这几天有点闲,同事让我搞一个一键发布,就和安装软件那样的 ...

  9. VS“新建网站”与“新建Asp.Net Web 应用程序”的区别

    WebApplication(新建Asp.Net Web 应用程序)编程模型的优点:针对大型网站 1.编译速度网站编译速度快,使用了增量编译模式,仅仅只有文件被修改后,这部分才会被增量编译进去. 2. ...

随机推荐

  1. 什么是Etcd?

    文章大部分引至:http://jolestar.com/etcd-architecture/ Etcd 按照官方介绍 Etcd is a distributed, consistent key-val ...

  2. private、protected和public的区别

    private 是完全私有的,只有当前类中的成员能访问到. protected 是受保护的,只有当前类的成员与继承该类的类才能访问. 这两个是访问类中成员权限的限制符.在类外如果想使用类中的成员,只能 ...

  3. 【NOIP模拟&POJ2152】灰色的果实(树形DP)

    题意: Nebula 历 2014 年 12 月 17 日,欢迎来到异世界. 面对截然不同的新世界,你决定采取最普通但最为有效的方式来探索,那便 是徒步.准备好营地的一切,你开始了探索的旅程. 步行大 ...

  4. SeaJS项目完整实例【转】

    index.html——主页面. sea.js——SeaJS脚本. init.js——init模块,入口模块,依赖data.jquery.style三个模块.由主页面载入. data.js——data ...

  5. java、android拼音,中文姓名排序

    http://blog.sina.com.cn/s/blog_81a9aa7e0100tizj.html 在java或者是android编程的时候,我们经常要用到对姓名或者其他字符串排序,现在我写写自 ...

  6. POJ 1470 Closest Common Ancestors【LCA Tarjan】

    题目链接: http://poj.org/problem?id=1470 题意: 给定若干有向边,构成有根数,给定若干查询,求每个查询的结点的LCA出现次数. 分析: 还是很裸的tarjan的LCA. ...

  7. 转 常见hash算法的原理

    散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫 ...

  8. Maven安装和手动安装jar到仓库

    1. 安装Maven 1.下载mvn到本地,解压. 2.新建系统变量MAVEN_HOME,值指向安装目录如D:\apache-maven-3.3.9 3.path变量中增加:%MAVEN_HOME%\ ...

  9. 从头开始学Android之(二)—— Android版本

    前面大致的介绍了一下Android的Linux内核层,知道Android是Google在Linux基础上创建的一个应用于移动设备的系统,并在针对移动设备的特殊性,在Linux上做了一些相应的改动建立起 ...

  10. HDU1306 String Matching 【暴力】

    String Matching Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...