C#中如何使用Calendar控件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
一、预备知识
在C#中可以开发两种服务器控件,一个是用户控件(User Control)和自定义控件(Custom Control)。用户控件的本质与页面文件(ASPx文件)差不多,是可被其它aspx页面重复使用的HTML代码段,当然它也包括后台代码(Code-behind),后缀名是ascx。所以在开发一些公用的静态页面时(例如页头,页脚)经常用到,但它的缺点是不易继承,不易分发,无法编译成二进制代码来进行部署。但是自定义控件的功能就强大许多,它可以被编译成二进制代码(DLL文件),可以被扩展、继承、分发。就像Web Form Control一样,其实它们每个控件就是一个DLL文件。
开发用户控件比较简单,就像编写一个aspx页面一样,在这里就不介绍了。本文对象是自定义控件。服务器控件的基类是System.Web.UI.Control。如果要开发可视化的服务器控件,那我们需要从 System.Web.UI.WebControls来继承,否则从System.Web.UI.Control继承。
服务器控件在设计时以runat=”server”脚本代码嵌入到aspx文件中来表示此控件是在服务器端运行的。在服务器控件所在页面提交回传(PostBack)过程中是依靠ViewState(视图状态)来维护控件状态的。所以我们在设计服务器控件属性时,其值应保存在ViewState 中。
二、代码编写
C#编写Calendar控件,但是现在我需要一个可以下拉的日历控件,并且初始时不显示日历,当我点击下拉按钮时才弹出,并且当选择了日期,日历会自动隐藏且选择的日期值会显示到相应的输入框中。显然Calendar控件不能满足我的需要,但是稍后我会在我的自定义控件中用到它。
首先新建项目,在项目类型中选择Visual C#项目,在模板列表中选择Web控件库,输入项目名称AquaCalendar,然后选择项目所在目录,点击【确定】按钮。C#将会生成基本的框架代码。将项目中的类文件和类名改名为DatePicker(即日期控件的类名)。由于DatePicker是可视化控件,所以我们必须从System.Web.UI.WebControls继承。并且它包括一个输入框,一个按钮和日历控件,需要在DatePicker类中声明它们。像这种以多个服务器控件组合的控件成为复合控件。代码如下,比较重要的方法和代码在注释中会加以说明:
using System; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; using System.Drawing; namespace AquaCalendar { [DefaultProperty("Text"), //在属性工具箱中显示的默认属性 ToolboxData("<{0}:DatePicker runat=server>")] public class DatePicker : System.Web.UI.WebControls.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("9pt"); _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("8pt"); _Calendar.DayHeaderStyle.Font.Bold = true; _Calendar.DayHeaderStyle.Height = Unit.Parse("8pt"); _Calendar.DayHeaderStyle.ForeColor = ColorTranslator.FromHtml("#333333"); _Calendar.NextPrevStyle.Font.Size = FontUnit.Parse("8pt"); _Calendar.NextPrevStyle.Font.Bold = true; _Calendar.NextPrevStyle.ForeColor = ColorTranslator.FromHtml("White"); _Calendar.TitleStyle.Font.Size = FontUnit.Parse("12pt"); _Calendar.TitleStyle.Font.Bold = true; _Calendar.TitleStyle.Height = Unit.Parse("12pt"); _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; } }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。