自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#編寫(xiě)Calendar控件淺析

開(kāi)發(fā) 后端
這里介紹C#編寫(xiě)Calendar控件,但是現(xiàn)在我需要一個(gè)可以下拉的日歷控件,并且初始時(shí)不顯示日歷,當(dāng)我點(diǎn)擊下拉按鈕時(shí)才彈出,并且當(dāng)選擇了日期,日歷會(huì)自動(dòng)隱藏且選擇的日期值會(huì)顯示到相應(yīng)的輸入框中。

C#語(yǔ)言還是比較常見(jiàn)的東西,這里我們主要介紹C#編寫(xiě)Calendar控件,包括介紹在C#中可以開(kāi)發(fā)兩種服務(wù)器控件,一個(gè)是用戶(hù)控件(User Control)和自定義控件(Custom Control)等方面。

Visual C#.net是微軟公司出品的一種新的編程語(yǔ)言(以下簡(jiǎn)稱(chēng)C#),它繼承了C語(yǔ)言的一些特性,也加入了一些新的元素。以前用過(guò)Delphi開(kāi)發(fā)程序的人可能剛開(kāi)始使用C#的時(shí)候,對(duì)其有一種似曾相識(shí)的感覺(jué)(至少包括我)。是的,C#語(yǔ)言的創(chuàng)始人正是以前在Borland公司開(kāi)發(fā)出Delphi語(yǔ)言的Anders Hejlsberg。在我開(kāi)始使用C#開(kāi)發(fā)程序時(shí),就覺(jué)得它是一款很棒的開(kāi)發(fā)Windows Form & Web程序的RAD工具。
在開(kāi)發(fā)Web程序方面,C#的出現(xiàn)打破了以前的網(wǎng)頁(yè)開(kāi)發(fā)模式,實(shí)現(xiàn)了與開(kāi)發(fā)Windows

Form程序一樣的所見(jiàn)即所得的功能。C#提供了一些常用的Web Form Control供開(kāi)發(fā)人員使用,并且只需將控件拖入頁(yè)面中即可,非常簡(jiǎn)單。但有時(shí)這些控件也不能滿(mǎn)足開(kāi)發(fā)人員的需要,需要開(kāi)發(fā)人員自己編寫(xiě)用戶(hù)控件(User Control)或自定義控件(Custom Control)來(lái)滿(mǎn)足需求。在這里,我將講解如何C#編寫(xiě)Calendar控件。

一、預(yù)備知識(shí)

在C#中可以開(kāi)發(fā)兩種服務(wù)器控件,一個(gè)是用戶(hù)控件(User Control)和自定義控件(Custom Control)。用戶(hù)控件的本質(zhì)與頁(yè)面文件(ASPx文件)差不多,是可被其它aspx頁(yè)面重復(fù)使用的HTML代碼段,當(dāng)然它也包括后臺(tái)代碼(Code-behind),后綴名是ascx。所以在開(kāi)發(fā)一些公用的靜態(tài)頁(yè)面時(shí)(例如頁(yè)頭,頁(yè)腳)經(jīng)常用到,但它的缺點(diǎn)是不易繼承,不易分發(fā),無(wú)法編譯成二進(jìn)制代碼來(lái)進(jìn)行部署。但是自定義控件的功能就強(qiáng)大許多,它可以被編譯成二進(jìn)制代碼(DLL文件),可以被擴(kuò)展、繼承、分發(fā)。就像Web Form Control一樣,其實(shí)它們每個(gè)控件就是一個(gè)DLL文件。

開(kāi)發(fā)用戶(hù)控件比較簡(jiǎn)單,就像編寫(xiě)一個(gè)aspx頁(yè)面一樣,在這里就不介紹了。本文對(duì)象是自定義控件。服務(wù)器控件的基類(lèi)是System.Web.UI.Control。如果要開(kāi)發(fā)可視化的服務(wù)器控件,那我們需要從 System.Web.UI.WebControls來(lái)繼承,否則從System.Web.UI.Control繼承。

服務(wù)器控件在設(shè)計(jì)時(shí)以runat=”server”腳本代碼嵌入到aspx文件中來(lái)表示此控件是在服務(wù)器端運(yùn)行的。在服務(wù)器控件所在頁(yè)面提交回傳(PostBack)過(guò)程中是依靠ViewState(視圖狀態(tài))來(lái)維護(hù)控件狀態(tài)的。所以我們?cè)谠O(shè)計(jì)服務(wù)器控件屬性時(shí),其值應(yīng)保存在ViewState 中。

二、代碼編寫(xiě)

C#編寫(xiě)Calendar控件,但是現(xiàn)在我需要一個(gè)可以下拉的日歷控件,并且初始時(shí)不顯示日歷,當(dāng)我點(diǎn)擊下拉按鈕時(shí)才彈出,并且當(dāng)選擇了日期,日歷會(huì)自動(dòng)隱藏且選擇的日期值會(huì)顯示到相應(yīng)的輸入框中。顯然Calendar控件不能滿(mǎn)足我的需要,但是稍后我會(huì)在我的自定義控件中用到它。

首先新建項(xiàng)目,在項(xiàng)目類(lèi)型中選擇Visual C#項(xiàng)目,在模板列表中選擇Web控件庫(kù),輸入項(xiàng)目名稱(chēng)AquaCalendar,然后選擇項(xiàng)目所在目錄,點(diǎn)擊【確定】按鈕。C#將會(huì)生成基本的框架代碼。將項(xiàng)目中的類(lèi)文件和類(lèi)名改名為DatePicker(即日期控件的類(lèi)名)。由于DatePicker是可視化控件,所以我們必須從System.Web.UI.WebControls繼承。并且它包括一個(gè)輸入框,一個(gè)按鈕和日歷控件,需要在DatePicker類(lèi)中聲明它們。像這種以多個(gè)服務(wù)器控件組合的控件成為復(fù)合控件。代碼如下,比較重要的方法和代碼在注釋中會(huì)加以說(shuō)明:

  1. using System;  
  2. using System.Web.UI;  
  3. using System.Web.UI.WebControls;  
  4. using System.ComponentModel;  
  5. using System.Drawing;  
  6.  
  7. namespace AquaCalendar  
  8. {  
  9. [DefaultProperty("Text"),  
  10.     //在屬性工具箱中顯示的默認(rèn)屬性  
  11. ToolboxData("<{0}:DatePicker runat=server>")]  
  12. public class DatePicker :  
  13.       System.Web.UI.WebControls.WebControl ,  
  14.        IPostBackEventHandler  
  15. {  
  16. //選擇日期按鈕的默認(rèn)樣式  
  17. private const string _BUTTONDEFAULTSTYLE = "BORDER-RIGHT: gray 1px solid; 
  18. BORDER-TOP: gray 1px solid; BORDER-LEFT: gray 1px solid; 
  19. CURSOR: hand; 
  20. BORDER-BOTTOM: gray 1px solid;";  
  21.  
  22. //按鈕默認(rèn)文本  
  23.  
  24. private const string _BUTTONDEFAULTTEXT = "...";  
  25. private System.Web.UI.WebControls.Calendar _Calendar;  
  26.  
  27. public override ControlCollection Controls  
  28. {  
  29. get  
  30. {  
  31. EnsureChildControls(); //確認(rèn)子控件集都已被創(chuàng)建  
  32. return base.Controls;  
  33. }  
  34. }  
  35.  
  36. //創(chuàng)建子控件(服務(wù)器日歷控件)  
  37.  
  38. protected override void CreateChildControls()  
  39. {  
  40. Controls.Clear();  
  41. _Calendar = new Calendar();  
  42. _Calendar.ID = MyCalendarID;  
  43. _Calendar.SelectedDate = DateTime.Parse(Text);  
  44. _Calendar.TitleFormat = TitleFormat.MonthYear;  
  45. _Calendar.NextPrevFormat = NextPrevFormat.ShortMonth;  
  46. _Calendar.CellSpacing = 0;  
  47. _Calendar.Font.Size = FontUnit.Parse("9pt");  
  48. _Calendar.Font.Name = "Verdana";  
  49. _Calendar.SelectedDayStyle.BackColor = ColorTranslator.FromHtml("#333399");  
  50. _Calendar.SelectedDayStyle.ForeColor = ColorTranslator.FromHtml("White");  
  51. _Calendar.DayStyle.BackColor = ColorTranslator.FromHtml("#CCCCCC");  
  52. _Calendar.TodayDayStyle.BackColor = ColorTranslator.FromHtml("#999999");  
  53. _Calendar.TodayDayStyle.ForeColor = ColorTranslator.FromHtml("Aqua");  
  54. _Calendar.DayHeaderStyle.Font.Size = FontUnit.Parse("8pt");  
  55. _Calendar.DayHeaderStyle.Font.Bold = true;  
  56. _Calendar.DayHeaderStyle.Height = Unit.Parse("8pt");  
  57. _Calendar.DayHeaderStyle.ForeColor = ColorTranslator.FromHtml("#333333");  
  58. _Calendar.NextPrevStyle.Font.Size = FontUnit.Parse("8pt");  
  59. _Calendar.NextPrevStyle.Font.Bold = true;  
  60. _Calendar.NextPrevStyle.ForeColor = ColorTranslator.FromHtml("White");  
  61. _Calendar.TitleStyle.Font.Size = FontUnit.Parse("12pt");  
  62. _Calendar.TitleStyle.Font.Bold = true;  
  63. _Calendar.TitleStyle.Height = Unit.Parse("12pt");  
  64. _Calendar.TitleStyle.ForeColor = ColorTranslator.FromHtml("White");  
  65. _Calendar.TitleStyle.BackColor = ColorTranslator.FromHtml("#333399");  
  66. _Calendar.OtherMonthDayStyle.ForeColor = ColorTranslator.FromHtml("#999999");  
  67. _Calendar.NextPrevFormat = NextPrevFormat.CustomText;  
  68. _Calendar.NextMonthText = "下月";  
  69. _Calendar.PrevMonthText = "上月";  
  70. _Calendar.Style.Add("display","none"); //默認(rèn)不顯示下拉日歷控件  
  71. _Calendar.SelectionChanged += new EventHandler(_Calendar_SelectionChanged);  
  72. this.Controls.Add(_Calendar);  
  73. }  
  74. [  
  75. Category("Appearance"), //該屬性所屬類(lèi)別,參見(jiàn)圖  
  76. DefaultValue(""), //屬性默認(rèn)值  
  77. Description("設(shè)置該日期控件的值。") //屬性的描述  
  78. ]  
  79.  
  80. public string Text  
  81. {  
  82. get  
  83. {  
  84. EnsureChildControls();  
  85. return (ViewState["Text"] == null)?System.DateTime.Today.
    ToString("yyyy-MM-dd"):ViewState["Text"].ToString();  
  86. }  
  87. set  
  88. {  
  89. EnsureChildControls();  
  90. DateTime dt = System.DateTime.Today;  
  91. try  
  92. {  
  93. dt = DateTime.Parse(value);  
  94. }  
  95. catch  
  96. {  
  97. throw new ArgumentOutOfRangeException("請(qǐng)輸入日期型字符串(例如:1981-04-29)!");  
  98. }  
  99.  
  100. ViewState["Text"] = DateFormat == CalendarEnum.LongDateTime?dt.
    ToString("yyyy-MM-dd"):dt.ToString("yyyy-M-d");  
  101. }  
  102. }  
  103.  
  104. //重載服務(wù)器控件的Enabled屬性,將選擇日期按鈕變灰(禁用)  
  105.  
  106. public override bool Enabled  
  107. {  
  108. get  
  109. {  
  110. EnsureChildControls();  
  111. return ViewState["Enabled"] == null?true:(bool)ViewState["Enabled"];  
  112. }  
  113. set  
  114. {  
  115. EnsureChildControls();  
  116. ViewState["Enabled"] = value;  
  117. }  
  118. }  
  119.  
  120. public string ButtonStyle  
  121. {  
  122. get  
  123. {  
  124. EnsureChildControls();  
  125. object o = ViewState["ButtonSytle"];  
  126. return (o == null)?_BUTTONDEFAULTSTYLE:o.ToString();  
  127. }  
  128. set  
  129. {  
  130. EnsureChildControls();  
  131. ViewState["ButtonSytle"] = value;  
  132. }  
  133. }  
  134.  
  135. [  
  136. DefaultValue(CalendarEnum.LongDateTime),  
  137. ]  
  138.  
  139. public CalendarEnum DateFormat  
  140. {  
  141. get  
  142. {  
  143. EnsureChildControls();  
  144. object format = ViewState["DateFormat"];  
  145. return format == null?CalendarEnum.LongDateTime:(CalendarEnum)format;  
  146. }  
  147. set  
  148. {  
  149. EnsureChildControls();  
  150. ViewState["DateFormat"] = value;  
  151. DateTime dt = DateTime.Parse(Text);  
  152. Text=DateFormat == CalendarEnum.LongDateTime?dt.
    ToString("yyyy-MM-dd"):dt.ToString("yyyy-M-d");  
  153. }  
  154. }  
  155.  
  156. [  
  157. Browsable(false),  
  158. DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)  
  159. ]  
  160.  
  161. public string MyCalendarID //復(fù)合控件ID  
  162. {  
  163. get  
  164. {  
  165. EnsureChildControls();  
  166. return this.ClientID+"_MyCalendar";  
  167. }  
  168. }  
  169.  
  170. [  
  171. Browsable(false),  
  172. DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)  
  173. ]  
  174.  
  175. public string MyCalendarName //復(fù)合控件名稱(chēng)  
  176. {  
  177. get  
  178. {  
  179. EnsureChildControls();  
  180. return this.UniqueID+":MyCalendar";  
  181. }  
  182. }  
  183.  
  184. [  
  185. Browsable(false),  
  186. DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)  
  187. ]  
  188.  
  189. public string DatePickerInputID //復(fù)合控件中輸入框的ID  
  190. {  
  191. get  
  192. {  
  193. EnsureChildControls();  
  194. return this.ClientID+"_DateInput";  
  195. }  
  196. }  
  197.  
  198. [  
  199. Browsable(false),  
  200. DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)  
  201. ]  
  202.  
  203. public string DatePickerInputName //復(fù)合控件中輸入框的名稱(chēng)  
  204. {  
  205. get  
  206. {  
  207. EnsureChildControls();  
  208. return this.UniqueID+":DateInput";  
  209. }  
  210. }  
  211.  
  212. [  
  213. Browsable(false),  
  214. DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)  
  215. ]  
  216.  
  217. public string DatePickerButtonID //復(fù)合控件中按鈕的ID  
  218. {  
  219. get  
  220. {  
  221. EnsureChildControls();  
  222. return this.ClientID+"_DateButton";  
  223. }  
  224. }  
  225.  
  226. [  
  227. Browsable(false),  
  228. DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)  
  229. ]  
  230.  
  231. public string DatePickerButtonName //復(fù)合控件中按鈕的名稱(chēng)  
  232. {  
  233. get  
  234. {  
  235. EnsureChildControls();  
  236. return this.UniqueID+":DateButton";  
  237. }  
  238. }  
  239.  
  240. public string ButtonText  
  241. {  
  242. get  
  243. {  
  244. EnsureChildControls();  
  245. return ViewState["ButtonText"] == null?_BUTTONDEFAULTTEXT:
    (string)ViewState["ButtonText"];  
  246. }  
  247. set  
  248. {  
  249. EnsureChildControls();  
  250. ViewState["ButtonText"] = value;  
  251. }  
  252. }  

【編輯推薦】

  1. C#字符ASCII碼學(xué)習(xí)經(jīng)驗(yàn)
  2. C#數(shù)值類(lèi)型之間的轉(zhuǎn)換概述
  3. 日期型數(shù)據(jù)轉(zhuǎn)換成C#長(zhǎng)整型數(shù)據(jù)
  4. C#查看Excel對(duì)象模型分析
  5. C#日期型數(shù)據(jù)簡(jiǎn)單剖析
責(zé)任編輯:佚名 來(lái)源: 博客園
相關(guān)推薦

2009-08-06 16:58:40

C#編寫(xiě)ActiveX

2009-08-11 14:45:41

C# DataGrid

2009-08-12 10:35:50

C#調(diào)用ActiveX

2009-09-04 17:58:38

C# Web Brow

2009-08-12 18:04:44

編寫(xiě)C#多線(xiàn)程

2009-08-18 16:31:19

Visual C#編寫(xiě)

2009-09-11 09:10:30

C#編寫(xiě)游戲

2009-08-14 10:35:25

C#最小化編寫(xiě)

2009-08-27 14:32:15

C#編寫(xiě)ActiveX

2009-09-11 10:41:20

C# WinForm控

2009-08-26 13:36:33

C#打印控件

2009-09-09 10:47:29

C# CheckBox

2009-08-14 09:43:59

C#復(fù)制構(gòu)造函數(shù)

2009-08-03 13:34:06

自定義C#控件

2009-09-08 14:54:40

C# listBox控

2009-08-28 16:31:21

C# treeview

2009-09-15 15:14:27

C# 綁定

2009-09-24 14:59:38

C#編寫(xiě)COM組件

2009-08-14 17:45:52

C# ArrayLis

2009-08-17 18:34:50

C# ChangeCo
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)