大数据之路

博客园 首页 新随笔 联系 订阅 管理
具体代码为
  1using System;
  2using System.Web.UI;
  3using System.Web.UI.WebControls;
  4using System.ComponentModel;
  5using System.Drawing;
  6namespace myCalendar
  7{
  8    /// <summary>
  9    /// WebCustomControl1 的摘要说明。
 10    /// </summary>

 11    [DefaultProperty("Text"),
 12    ToolboxData("<{0}:DatePicker  runat=server></{0}:DatePicker >")]
 13    public class DatePicker  : System.Web.UI.WebControls.WebControl, IPostBackEventHandler
 14    {
 15        //选择日期按钮的默认样式
 16      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;";
 17
 18      //按钮默认文本
 19
 20      private const string _BUTTONDEFAULTTEXT = "";
 21      private System.Web.UI.WebControls.Calendar _Calendar;
 22        public override ControlCollection Controls
 23        {
 24            get
 25            {
 26                EnsureChildControls(); //确认子控件集都已被创建
 27                return base.Controls;
 28            }

 29        }

 30        //创建子控件(服务器日历控件)
 31        protected override void CreateChildControls()
 32        {
 33            Controls.Clear();
 34            _Calendar = new Calendar();
 35            _Calendar.ID = MyCalendarID;
 36            _Calendar.SelectedDate = DateTime.Parse(Text);
 37            _Calendar.TitleFormat = TitleFormat.MonthYear;
 38            _Calendar.NextPrevFormat = NextPrevFormat.ShortMonth;
 39            _Calendar.CellSpacing = 0;
 40            _Calendar.Font.Size = FontUnit.Parse("9pt");
 41            _Calendar.Font.Name = "Verdana";
 42            _Calendar.SelectedDayStyle.BackColor = ColorTranslator.FromHtml("#333399");
 43            _Calendar.SelectedDayStyle.ForeColor = ColorTranslator.FromHtml("White");
 44            _Calendar.DayStyle.BackColor = ColorTranslator.FromHtml("#CCCCCC");
 45            _Calendar.TodayDayStyle.BackColor = ColorTranslator.FromHtml("#999999");
 46            _Calendar.TodayDayStyle.ForeColor = ColorTranslator.FromHtml("Aqua");
 47            _Calendar.DayHeaderStyle.Font.Size = FontUnit.Parse("8pt");
 48            _Calendar.DayHeaderStyle.Font.Bold = true;
 49            _Calendar.DayHeaderStyle.Height = Unit.Parse("8pt");
 50            _Calendar.DayHeaderStyle.ForeColor = ColorTranslator.FromHtml("#333333");
 51            _Calendar.NextPrevStyle.Font.Size = FontUnit.Parse("8pt"); 
 52            _Calendar.NextPrevStyle.Font.Bold = true;
 53            _Calendar.NextPrevStyle.ForeColor = ColorTranslator.FromHtml("White");
 54            _Calendar.TitleStyle.Font.Size = FontUnit.Parse("12pt"); 
 55            _Calendar.TitleStyle.Font.Bold = true;
 56            _Calendar.TitleStyle.Height = Unit.Parse("12pt");
 57            _Calendar.TitleStyle.ForeColor = ColorTranslator.FromHtml("White");
 58            _Calendar.TitleStyle.BackColor = ColorTranslator.FromHtml("#333399");
 59            _Calendar.OtherMonthDayStyle.ForeColor = ColorTranslator.FromHtml("#999999");
 60            _Calendar.NextPrevFormat = NextPrevFormat.CustomText;
 61            _Calendar.NextMonthText = "下月";
 62            _Calendar.PrevMonthText = "上月";
 63            _Calendar.Style.Add("display","none"); //默认不显示下拉日历控件
 64            _Calendar.SelectionChanged += new EventHandler(_Calendar_SelectionChanged);
 65            this.Controls.Add(_Calendar);
 66        }

 67        [
 68        Category("Appearance"), //该属性所属类别
 69        DefaultValue(""), //属性默认值
 70        Description("设置该日期控件的值。"//属性的描述
 71        ]
 72        public string Text
 73        {
 74            get
 75            {
 76                EnsureChildControls();
 77                return (ViewState["Text"== null)?System.DateTime.Today.ToString("yyyy-MM-dd"):ViewState["Text"].ToString();
 78            }

 79            set
 80            {
 81                EnsureChildControls();
 82                DateTime dt = System.DateTime.Today;
 83                try
 84                {
 85                    dt = DateTime.Parse(value);
 86                }

 87                catch
 88                {
 89                    throw new ArgumentOutOfRangeException("请输入日期型字符串(例如:1981-04-29)!");
 90                }

 91                ViewState["Text"= dt.ToString("yyyy-MM-dd");
 92            }

 93        }

 94        //重载服务器控件的Enabled属性,将选择日期按钮变灰(禁用)
 95        public override bool Enabled
 96        {
 97            get
 98            {
 99                EnsureChildControls();
100                return ViewState["Enabled"== null?true:(bool)ViewState["Enabled"];
101            }

102            set
103            {
104                EnsureChildControls();
105                ViewState["Enabled"= value;
106            }

107        }

108        public string ButtonStyle
109        {
110            get
111            {
112                EnsureChildControls();
113                object o = ViewState["ButtonSytle"];
114                return (o == null)?_BUTTONDEFAULTSTYLE:o.ToString();
115            }

116            set
117            {
118                EnsureChildControls();
119                ViewState["ButtonSytle"= value;
120            }

121        }

122        [
123        Browsable(false),
124        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
125        ]
126        public string MyCalendarID //复合控件ID
127        {
128            get
129            {
130                
131                EnsureChildControls();
132                return this.ClientID+"_MyCalendar";
133            }

134        }

135        [
136        Browsable(false),
137        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
138        ]
139        public string MyCalendarName //复合控件名称
140        {
141            get
142            {
143                EnsureChildControls();
144                return this.UniqueID+":MyCalendar";
145            }

146        }

147        [
148        Browsable(false),
149        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
150        ]
151        public string DatePickerInputID //复合控件中输入框的ID
152        {
153            get
154            {
155                EnsureChildControls();
156                return this.ClientID+"_DateInput";
157            }

158        }

159        [
160        Browsable(false),
161        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
162        ]
163        public string DatePickerInputName //复合控件中输入框的名称
164        {
165            get
166            {
167                EnsureChildControls();
168                return this.UniqueID+":DateInput";
169            }

170        }

171        [
172        Browsable(false),
173        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
174        ]
175        public string DatePickerButtonID //复合控件中按钮的ID
176        {
177            get
178            {
179                EnsureChildControls();
180                return this.ClientID+"_DateButton";
181            }

182        }

183        [
184        Browsable(false),
185        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
186        ]
187        public string DatePickerButtonName //复合控件中按钮的名称
188        {
189            get
190            {
191                EnsureChildControls();
192                return this.UniqueID+":DateButton";
193            }

194        }

195        public string ButtonText
196        {
197            get
198            {
199                EnsureChildControls();
200                return ViewState["ButtonText"== null?_BUTTONDEFAULTTEXT:(string)ViewState["ButtonText"];
201            }

202            set
203            {
204                EnsureChildControls();
205                ViewState["ButtonText"= value;
206            }

207        }

208        /// <summary>
209        /// /// 将此控件呈现给指定的输出参数。
210        /// </summary>
211        /// /// <param name="output"> 要写出到的 HTML 编写器 </param>
212        /// 

213        protected override void Render(HtmlTextWriter output)
214        {
215            //在页面中输出控件时,产生一个表格(二行二列),以下是表格的样式
216            output.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0");
217            output.AddAttribute(HtmlTextWriterAttribute.Border, "0");
218            output.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0");
219            output.AddStyleAttribute("LEFT"this.Style["LEFT"]);
220            output.AddStyleAttribute("TOP"this.Style["TOP"]);
221            output.AddStyleAttribute("POSITION""absolute");
222            
223            if (Width != Unit.Empty)
224            {
225                output.AddStyleAttribute(HtmlTextWriterStyle.Width, Width.ToString());
226            }

227            else
228            {
229                output.AddStyleAttribute(HtmlTextWriterStyle.Width, "200px");
230            }

231            output.RenderBeginTag(HtmlTextWriterTag.Table); //输出表格
232            output.RenderBeginTag(HtmlTextWriterTag.Tr); //表格第一行
233            output.AddAttribute(HtmlTextWriterAttribute.Width, "90%");
234            output.RenderBeginTag(HtmlTextWriterTag.Td);
235            //以下是第一行第一列中文本框的属性及其样式设置
236            if (!Enabled)
237            {
238                output.AddAttribute(HtmlTextWriterAttribute.ReadOnly, "true");
239            }

240            output.AddAttribute(HtmlTextWriterAttribute.Type, "Text");
241            output.AddAttribute(HtmlTextWriterAttribute.Id, DatePickerInputID);
242            output.AddAttribute(HtmlTextWriterAttribute.Name, DatePickerInputName);
243            output.AddAttribute(HtmlTextWriterAttribute.Value, Text);
244            output.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%");
245            output.AddStyleAttribute(HtmlTextWriterStyle.Height, "100%");
246            output.AddStyleAttribute(HtmlTextWriterStyle.FontFamily, Font.Name);
247            output.AddStyleAttribute(HtmlTextWriterStyle.FontSize, Font.Size.ToString());
248            output.AddStyleAttribute(HtmlTextWriterStyle.FontWeight, Font.Bold?"bold":"");
249            output.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, ColorTranslator.ToHtml(BackColor));
250            output.AddStyleAttribute(HtmlTextWriterStyle.Color, ColorTranslator.ToHtml(ForeColor));
251            output.RenderBeginTag(HtmlTextWriterTag.Input); //输出文本框
252            output.RenderEndTag();
253            output.RenderEndTag();
254            output.AddAttribute(HtmlTextWriterAttribute.Width, "*");
255            output.RenderBeginTag(HtmlTextWriterTag.Td);
256            //以下是第一行第二列中按钮的属性及其样式设置
257            if (!Enabled)
258            {
259                output.AddAttribute(HtmlTextWriterAttribute.Disabled, "true");
260            }

261            output.AddAttribute(HtmlTextWriterAttribute.Type, "Submit");
262            output.AddAttribute(HtmlTextWriterAttribute.Id, DatePickerButtonID);
263            output.AddAttribute(HtmlTextWriterAttribute.Name, DatePickerButtonName);
264            output.AddAttribute(HtmlTextWriterAttribute.Value, ButtonText);
265            output.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%");
266            output.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.GetPostBackEventReference(this)); //点击按钮时需要回传服务器来触发后面的OnClick事件
267            output.AddAttribute(HtmlTextWriterAttribute.Style, ButtonStyle);
268            output.RenderBeginTag(HtmlTextWriterTag.Input); //输出按钮
269            output.RenderEndTag();
270            output.RenderEndTag();
271            output.RenderEndTag();
272            output.RenderBeginTag(HtmlTextWriterTag.Tr);
273            output.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
274            output.RenderBeginTag(HtmlTextWriterTag.Td);
275            _Calendar.RenderControl(output); //将日历子控件输出
276            output.RenderEndTag();
277            output.RenderEndTag();
278            output.RenderEndTag();
279        }

280        //复合控件必须继承IpostBackEventHandler接口,才能继承RaisePostBackEvent事件
281        public void RaisePostBackEvent(string eventArgument)
282        {
283            OnClick(EventArgs.Empty);
284        }

285        protected virtual void OnClick(EventArgs e)
286        {
287            //点击选择日期按钮时,如果日历子控件没有显示则显示出来并将文本框的值赋值给日历子控件
288            if (_Calendar.Attributes["display"!= "")
289            {
290                _Calendar.SelectedDate = DateTime.Parse(Text);
291                _Calendar.Style.Add("display","");
292            }

293        }

294        //复合控件中的日历控件日期变化事件
295        private void _Calendar_SelectionChanged(object sender, EventArgs e)
296        {
297            //当选择的日期变化时,将所选日期赋值给文本框并将日历子控件隐藏
298            Text = _Calendar.SelectedDate.ToString();
299            _Calendar.Style.Add("display","none");
300        }

301    }

302}

303
posted on 2006-07-12 17:36  小潘  阅读(451)  评论(0)    收藏  举报