天天看點

用VisualC#.NET編寫伺服器日期控件(源碼)

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.ComponentModel;

using System.Drawing;

namespace CreateTech.Retail.ServerControl

{

    public enum CalendarEnum

    {

        ShortDateTime,

        LongDateTime

    }

    [DefaultProperty("Text")]

    [ToolboxData("<{0}:DatePicker runat=server></{0}:DatePicker>")]

    public class DatePicker : WebControl, IPostBackEventHandler

    {

        //選擇日期按鈕的預設樣式

        private const string _BUTTONDEFAULTSTYLE = "BORDER-RIGHT: gray 1px solid; BORDER-TOP: gray 1px solid; BORDER-LEFT: gray 1px solid; CURSOR: hand; BORDER-BOTTOM: gray 1px solid;";

        //按鈕預設文本

        private const string _BUTTONDEFAULTTEXT = "...";

        private System.Web.UI.WebControls.Calendar _Calendar;

        public override ControlCollection Controls

        {

            get

            {

                EnsureChildControls(); //确認子控件集都已被建立

                return base.Controls;

            }

        }

        //建立子控件(伺服器月曆控件)

        protected override void CreateChildControls()

        {

            Controls.Clear();

            _Calendar = new Calendar();

            _Calendar.ID = MyCalendarID;

            _Calendar.SelectedDate = DateTime.Parse(Text);

            _Calendar.TitleFormat = TitleFormat.MonthYear;

            _Calendar.NextPrevFormat = NextPrevFormat.ShortMonth;

            _Calendar.CellSpacing = 0;

            _Calendar.Font.Size = FontUnit.Parse("12px");

            _Calendar.Font.Name = "Verdana";

            _Calendar.SelectedDayStyle.BackColor = ColorTranslator.FromHtml("#333399");

            _Calendar.SelectedDayStyle.ForeColor = ColorTranslator.FromHtml("White");

            _Calendar.DayStyle.BackColor = ColorTranslator.FromHtml("#CCCCCC");

            _Calendar.TodayDayStyle.BackColor = ColorTranslator.FromHtml("#999999");

            _Calendar.TodayDayStyle.ForeColor = ColorTranslator.FromHtml("Aqua");

            _Calendar.DayHeaderStyle.Font.Size = FontUnit.Parse("12px");

            _Calendar.DayHeaderStyle.Font.Bold = true;

            _Calendar.DayHeaderStyle.Height = Unit.Parse("12px");

            _Calendar.DayHeaderStyle.ForeColor = ColorTranslator.FromHtml("#333333");

            _Calendar.NextPrevStyle.Font.Size = FontUnit.Parse("12px");

            _Calendar.NextPrevStyle.Font.Bold = true;

            _Calendar.NextPrevStyle.ForeColor = ColorTranslator.FromHtml("White");

            _Calendar.TitleStyle.Font.Size = FontUnit.Parse("12px");

            _Calendar.TitleStyle.Font.Bold = true;

            _Calendar.TitleStyle.Height = Unit.Parse("12px");

            _Calendar.TitleStyle.ForeColor = ColorTranslator.FromHtml("White");

            _Calendar.TitleStyle.BackColor = ColorTranslator.FromHtml("#333399");

            _Calendar.OtherMonthDayStyle.ForeColor = ColorTranslator.FromHtml("#999999");

            _Calendar.NextPrevFormat = NextPrevFormat.CustomText;

            _Calendar.NextMonthText = "下月";

            _Calendar.PrevMonthText = "上月";

            _Calendar.Style.Add("display", "none"); //預設不顯示下拉月曆控件

            _Calendar.SelectionChanged += new EventHandler(_Calendar_SelectionChanged);

            this.Controls.Add(_Calendar);

        }

        [

         Category("Appearance"), //該屬性所屬類别,參見圖

         DefaultValue(""), //屬性預設值

         Description("設定該日期控件的值。") //屬性的描述

        ]

        public string Text

        {

            get

            {

                EnsureChildControls();

                return (ViewState["Text"] == null) ? System.DateTime.Today.ToString("yyyy-MM-dd") : ViewState["Text"].ToString();

            }

            set

            {

                EnsureChildControls();

                DateTime dt = System.DateTime.Today;

                try

                {

                    dt = DateTime.Parse(value);

                }

                catch

                {

                    throw new ArgumentOutOfRangeException("請輸入日期型字元串(例如:1981-04-29)!");

                }

                ViewState["Text"] = DateFormat == CalendarEnum.LongDateTime ? dt.ToString("yyyy-MM-dd") : dt.ToString("yyyy-M-d");

            }

        }

        //重載伺服器控件的Enabled屬性,将選擇日期按鈕變灰(禁用)

        public override bool Enabled

        {

            get

            {

                EnsureChildControls();

                return ViewState["Enabled"] == null ? true : (bool)ViewState["Enabled"];

            }

            set

            {

                EnsureChildControls();

                ViewState["Enabled"] = value;

            }

        }

        public string ButtonStyle

        {

            get

            {

                EnsureChildControls();

                object o = ViewState["ButtonSytle"];

                return (o == null) ? _BUTTONDEFAULTSTYLE : o.ToString();

            }

            set

            {

                EnsureChildControls();

                ViewState["ButtonSytle"] = value;

            }

        }

        [

         DefaultValue(CalendarEnum.LongDateTime),

        ]

        public CalendarEnum DateFormat

        {

            get

            {

                EnsureChildControls();

                object format = ViewState["DateFormat"];

                return format == null ? CalendarEnum.LongDateTime : (CalendarEnum)format;

            }

            set

            {

                EnsureChildControls();

                ViewState["DateFormat"] = value;

                DateTime dt = DateTime.Parse(Text);

                Text = DateFormat == CalendarEnum.LongDateTime ? dt.ToString("yyyy-MM-dd") : dt.ToString("yyyy-M-d");

            }

        }

        [

         Browsable(false),

         DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)

        ]

        public string MyCalendarID //複合控件ID

        {

            get

            {

                EnsureChildControls();

                return this.ClientID + "_MyCalendar";

            }

        }

        [

         Browsable(false),

         DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)

        ]

        public string MyCalendarName //複合控件名稱

        {

            get

            {

                EnsureChildControls();

                return this.UniqueID + ":MyCalendar";

            }

        }

        [

         Browsable(false),

         DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)

        ]

        public string DatePickerInputID //複合控件中輸入框的ID

        {

            get

            {

                EnsureChildControls();

                return this.ClientID + "_DateInput";

            }

        }

        [

         Browsable(false),

         DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)

        ]

        public string DatePickerInputName //複合控件中輸入框的名稱

        {

            get

            {

                EnsureChildControls();

                return this.UniqueID + ":DateInput";

            }

        }

        [

         Browsable(false),

         DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)

        ]

        public string DatePickerButtonID //複合控件中按鈕的ID

        {

            get

            {

                EnsureChildControls();

                return this.ClientID + "_DateButton";

            }

        }

        [

         Browsable(false),

         DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)

        ]

        public string DatePickerButtonName //複合控件中按鈕的名稱

        {

            get

            {

                EnsureChildControls();

                return this.UniqueID + ":DateButton";

            }

        }

        public string ButtonText

        {

            get

            {

                EnsureChildControls();

                return ViewState["ButtonText"] == null ? _BUTTONDEFAULTTEXT : (string)ViewState["ButtonText"];

            }

            set

            {

                EnsureChildControls();

                ViewState["ButtonText"] = value;

            }

        }

        ///

        /// 将此控件呈現給指定的輸出參數。

        ///

        /// 要寫出到的 HTML 編寫器

        protected override void Render(HtmlTextWriter output)

        {

            //在頁面中輸出控件時,産生一個表格(二行二列),以下是表格的樣式

            output.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0");

            output.AddAttribute(HtmlTextWriterAttribute.Border, "0");

            output.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0");

            //output.AddStyleAttribute("LEFT", this.Style["LEFT"]);

            //output.AddStyleAttribute("TOP", this.Style["TOP"]);

            //output.AddStyleAttribute("POSITION", "absolute");

            if (Width != Unit.Empty)

            {

                output.AddStyleAttribute(HtmlTextWriterStyle.Width, Width.ToString());

            }

            else

            {

                output.AddStyleAttribute(HtmlTextWriterStyle.Width, "200px");

            }

            output.RenderBeginTag(HtmlTextWriterTag.Table); //輸出表格

            output.RenderBeginTag(HtmlTextWriterTag.Tr); //表格第一行

            output.AddAttribute(HtmlTextWriterAttribute.Width, "90%");

            output.RenderBeginTag(HtmlTextWriterTag.Td);

            //以下是第一行第一列中文本框的屬性及其樣式設定

            if (!Enabled)

            {

                output.AddAttribute(HtmlTextWriterAttribute.ReadOnly, "true");

            }

            output.AddAttribute(HtmlTextWriterAttribute.Type, "Text");

            output.AddAttribute(HtmlTextWriterAttribute.Id, DatePickerInputID);

            output.AddAttribute(HtmlTextWriterAttribute.Name, DatePickerInputName);

            output.AddAttribute(HtmlTextWriterAttribute.Value, Text);

            output.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%");

            output.AddStyleAttribute(HtmlTextWriterStyle.Height, "100%");

            output.AddStyleAttribute(HtmlTextWriterStyle.FontFamily, Font.Name);

            output.AddStyleAttribute(HtmlTextWriterStyle.FontSize, Font.Size.ToString());

            output.AddStyleAttribute(HtmlTextWriterStyle.FontWeight, Font.Bold ? "bold" : "");

            output.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, ColorTranslator.ToHtml(BackColor));

            output.AddStyleAttribute(HtmlTextWriterStyle.Color, ColorTranslator.ToHtml(ForeColor));

            output.RenderBeginTag(HtmlTextWriterTag.Input); //輸出文本框

            output.RenderEndTag();

            output.RenderEndTag();

            output.AddAttribute(HtmlTextWriterAttribute.Width, "*");

            output.RenderBeginTag(HtmlTextWriterTag.Td);

            //以下是第一行第二列中按鈕的屬性及其樣式設定

            if (!Enabled)

            {

                output.AddAttribute(HtmlTextWriterAttribute.Disabled, "true");

            }

            output.AddAttribute(HtmlTextWriterAttribute.Type, "Submit");

            output.AddAttribute(HtmlTextWriterAttribute.Id, DatePickerButtonID);

            output.AddAttribute(HtmlTextWriterAttribute.Name, DatePickerButtonName);

            output.AddAttribute(HtmlTextWriterAttribute.Value, ButtonText);

            output.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%");

            output.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.GetPostBackEventReference(this)); //點選按鈕時需要回傳伺服器來觸發後面的onClick事件

            output.AddAttribute(HtmlTextWriterAttribute.Style, ButtonStyle);

            output.RenderBeginTag(HtmlTextWriterTag.Input); //輸出按鈕

            output.RenderEndTag();

            output.RenderEndTag();

            output.RenderEndTag();

            output.RenderBeginTag(HtmlTextWriterTag.Tr);

            output.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");

            output.RenderBeginTag(HtmlTextWriterTag.Td);

            _Calendar.RenderControl(output); //将月曆子控件輸出

            output.RenderEndTag();

            output.RenderEndTag();

            output.RenderEndTag();

        }

        //複合控件必須繼承IpostBackEventHandler接口,才能繼承RaisePostBackEvent事件

        public void RaisePostBackEvent(string eventArgument)

        {

            onClick(EventArgs.Empty);

        }

        protected virtual void onClick(EventArgs e)

        {

            //點選選擇日期按鈕時,如果月曆子控件沒有顯示則顯示出來并将文本框的值指派給月曆子控件

            if (_Calendar.Attributes["display"] != "")

            {

                _Calendar.SelectedDate = DateTime.Parse(Text);

                _Calendar.Style.Add("display", "");

            }

        }

        //複合控件中的月曆控件日期變化事件

        private void _Calendar_SelectionChanged(object sender, EventArgs e)

        {

            //當選擇的日期變化時,将所選日期指派給文本框并将月曆子控件隐藏

            Text = _Calendar.SelectedDate.ToString();

            _Calendar.Style.Add("display", "none");

        }

        protected override void RenderContents(HtmlTextWriter output)

        {

            output.Write(Text);

        }

    }

}