位置:海鸟网 > IT > ASP.NET >

刚写好的Asp.Net时间和日期的Label控件。作为讲解Asp.net控件开发的第一部分:继承开发(3)

//==========================================================================
//名称: ZYQ.WebControls.Cultural.DateTimePick.DateTimePickLabel
//       Asp.Net服务控件
//版本: 1.0.0.0
//作者: 张宇庆
//日期: 2003.2.12
//Email: raxzhang@sina.com
//说明: 本控件及源代码只是为《计算机世界》开发者俱乐部Asp.Net论坛学习如何开发Asp.net
//       服务器端控件而开发。未经本人同意请勿用作商业用途。
//
//==========================================================================
using System;
using System.Drawing.Design;
using System.Globalization;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ZYQ;
namespace ZYQ.WebControls.Cultural.DateTimePick
{
    #region DateFormatOption
    /// <summary>
    /// 枚举类。DateTimeFormatInfo的日期和时间的格式类型
    /// (Default,ShortDate,LongDate,FullDate,RFC1123,ISO8601,UniversalSortableDateTime,ShortTime,LongTime,MonthDay,YearMonth)
    /// </summary>
    public enum DateFormatOption
    {
        Customer,
        ShortDate,
        LongDate,
        FullDate,
        RFC1123,
        ISO8601,
        UniversalSortableDateTime,
        ShortTime,
        LongTime,
        MonthDay,
        YearMonth,        
    }
    #endregion
    #region FormatChangeEventArgs
    /// <summary>
    /// FormatChangeEventArgs: 继承自System.EventArgs.
    /// 格式变化会触发。
    /// </summary>
    public class FormatChangeEventArgs: EventArgs
    {
        #region 私有变量声明
        DTFormatSetting _dtSetting;
        #endregion
        #region 属性
        /// <summary>
        /// (get)返回 ZYQ.WebControls.cultural.DateTimePick.DTFormatSetting对象
        /// </summary>
        public DTFormatSetting DTSetting
        {
            get{return this._dtSetting;}
        }
        #endregion
        #region 构造
        public FormatChangeEventArgs(DTFormatSetting newSetting)
        {                 
            this._dtSetting = newSetting;
        }
        #endregion
    }
    #endregion
    #region DateTimeFormateEventHandler
    /// <summary>
    /// 委托FormatChangeEventArgs
    /// </summary>
    public delegate void DateTimeFormateEventHandler(object Sender,FormatChangeEventArgs e);
    #endregion
    #region DTFormatSetting
    /// <summary>
    /// 自定义的时间和日期的格式
    /// </summary>
    [Editor(typeof(ZYQ.WebControls.Cultural.Design.DateTimePickDesign),typeof(UITypeEditor))]    
    public class DTFormatSetting
    {
        #region 私有变量声明
        private string _datetimeFormat;             //设置时间显示的格式,类初始化时会指定一个初始格式        
        private string _languageCode;               //语言代码
        public event DateTimeFormateEventHandler DateTimeFormatChanged; //声明事件
        #endregion
        #region 属性
        /// <summary>
        /// RFC 1766 name。
        /// 由此属性可创建ZYQ.zyqCultrueInfo对象。
        /// 变更此属性会触发DateTimeFormatChanged事件。
        /// </summary>
        [NotifyParentProperty(true),Browsable(true),Category("Appearance"),Description("设置和获取选定国家和语言的RFC 1766 name。默认为:zh-CN 中文(中华人民共和国)"),DefaultValue("zh-cn")]
        public string LanguageAndCountry
        {
            get
            {   
                return this._languageCode.ToLower();
            }
            set
            {
                this._languageCode =value;
                FormatChangeEventArgs e = new FormatChangeEventArgs(this);
                this.OnDateFormatChanged(e);
            }
        }
        
        /// <summary>
        /// 自定义的格式字符串。如:“yy/MM/dd”。
        /// 变更此属性会触发DateTimeFormatChanged事件。
        /// </summary>
        [NotifyParentProperty(true),Browsable(true),Category("Appearance"),DefaultValue("yyyy'年'M'月'd'日' H:mm:ss"),Description("在当前CultrueInfo允许的范围中,可自定义时间和日期的显示格式。")]
        public string FormateString
        {
            get{return this._datetimeFormat;}
            set
            {
                this._datetimeFormat=value;
                FormatChangeEventArgs e = new FormatChangeEventArgs(this);
                this.OnDateFormatChanged(e);
            }
        }
        #endregion
        #region 构造
        /// <summary>
        /// 创建DTFormatSetting对象。
        /// </summary>
        public DTFormatSetting()
        {        
            this._languageCode = CultureInfo.CurrentCulture.Name;
            this._datetimeFormat = CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern;
            FormatChangeEventArgs e = new FormatChangeEventArgs(this);
            this.OnDateFormatChanged(e);
        }
        /// <summary>
        /// 通过System.Globalization.CultureInfo及子类创建DTFormatSetting对象。
        /// </summary>
        /// <param name="cul">System.Globalization.CultureInfo及子类</param>
        public DTFormatSetting(CultureInfo cul)
        {
            zyqCultrueInfo myInfo = new zyqCultrueInfo(cul.Name,true);
            this._languageCode = cul.Name;            
            this._datetimeFormat =myInfo.DateTimeFormat.FullDateTimePattern;
            FormatChangeEventArgs e = new FormatChangeEventArgs(this);
            this.OnDateFormatChanged(e);
        }
        /// <summary>
        /// 通过语言国家码创建DTFormatSetting对象。
        /// </summary>
        /// <param name="languageName">语言国家码(如: zh-CN)</param>
        public DTFormatSetting(string language)
        {
            this._languageCode = language;
            zyqCultrueInfo myInfo = new zyqCultrueInfo(language,true);                        
            this._datetimeFormat =myInfo.DateTimeFormat.FullDateTimePattern;
            FormatChangeEventArgs e = new FormatChangeEventArgs(this);
            this.OnDateFormatChanged(e);
        }
        
        /// <summary>
        /// 创建DTFormatSetting对象.
        /// </summary>
        /// <param name="dtf">格式化的时间日期的字符串("yyyy/MM/dd HH:mm:ss tt")</param>
        /// <param name="language">语言国家码(如: zh-CN)</param>
        public DTFormatSetting(string dtf,string language)
        {
            this._languageCode =language;
            this._datetimeFormat = dtf;
            FormatChangeEventArgs e = new FormatChangeEventArgs(this);
            this.OnDateFormatChanged(e);
        }            
        #endregion
        #region 受保护的事件处理方法
        /// <summary>
        /// DateTimeFormatChanged事件的处理。
        /// </summary>
        /// <param name="eventArgument">FormatChangeEventArgs</param>
        protected virtual void OnDateFormatChanged(FormatChangeEventArgs eventArgument)
        {
            if(this.DateTimeFormatChanged !=null)
            {
                this.DateTimeFormatChanged(this,eventArgument);
            }
        }
        #endregion
    }
    #endregion
    #region DTFormatSettingConvert
    /// <summary>
    /// 实现DTFormatSetting类型和String类型的双向转换。继承自ExpandableObjectConverter
    /// </summary>
    public class DTFormatSettingConverter:ExpandableObjectConverter
    {
        #region 构造
        /// <summary>
        ///创建DTFormatSettingConverter类。
        /// </summary>
        public DTFormatSettingConverter()
        {
        }
        #endregion
        #region 私有辅助方法
        /// <summary>
        /// 将DTFormatSetting转化为String类型。
        /// </summary>
        /// <param name="obj">DTFormatSetting</param>
        /// <returns>String</returns>
        private string ToString(object obj)
        {
            DTFormatSetting formatting= obj as DTFormatSetting;
            return string.Format("{0},{1}",formatting.FormateString,formatting.LanguageAndCountry);//{2},{3},{4},{5}",formatting.FormateString,formatting.LanguageAndCountry,formatting.DateSeparator,formatting.TimeSeparator,formatting.AMDesignator,formatting.PMDesignator);      
        }
        /// <summary>
        /// 将String转化为DTFormatSetting类型。
        /// </summary>
        /// <param name="obj">String</param>
        /// <returns>DTFormatSetting</returns>
        private DTFormatSetting FromString(object obj)
        {
            string[] values=((string)obj).Split(',');
            if(values.Length !=2)
                throw new Exception("设置值无法转换");
            try
            {
                return new DTFormatSetting(values[0],values[1]);
            }
            catch
            {
                throw new Exception("设置值无法转换");
            }

        }
        #endregion
        #region 重写TypeConvert类的相关方法和函数        
        public override bool CanConvertFrom(ITypeDescriptorContext context,Type sourceType)
        {
            if(sourceType ==typeof(string))
                return true;
            return base.CanConvertFrom(context,sourceType);
        }
        public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,object value)
        {
            if(value==typeof(string))    
                return FromString(value);
            return base.ConvertFrom(context,culture,value);  
        }
        public override bool CanConvertTo(ITypeDescriptorContext context,Type destinationType)
        {
            if(destinationType ==typeof(DTFormatSetting))
                return true;
            return base.CanConvertTo(context,destinationType);
        }
        public override object ConvertTo(ITypeDescriptorContext context,CultureInfo culture,object value,Type destinationType)
        {
            if((destinationType == typeof(string))&& value is DTFormatSetting)    
                return ToString(value);
            return base.ConvertTo(context,culture,value,destinationType);
        }
        #endregion
    }
    #endregion

}