分享
 
 
 

用Visual C#.NET编写服务器日期控件

王朝c#·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

一、序言

Visual C#.NET是微软公司出品的一种新的编程语言(以下简称C#),它继承了C语言的一些特性,也加入了一些新的元素。以前用过Delphi开发程序的人可能刚开始使用C#的时候,对其有一种似曾相识的感觉(至少包括我)。是的,C#语言的创始人正是以前在Borland公司开发出Delphi语言的Anders Hejlsberg。在我开始使用C#开发程序时,就觉得它是一款很棒的开发Windows Form & Web程序的RAD工具。

在开发Web程序方面,C#的出现打破了以前的网页开发模式,实现了与开发Windows

Form程序一样的所见即所得的功能。C#提供了一些常用的Web Form Control供开发人员使用,并且只需将控件拖入页面中即可,非常简单。但有时这些控件也不能满足开发人员的需要,需要开发人员自己编写用户控件(User Control)或自定义控件(Custom Control)来满足需求。在这里,我将讲解如何在C#中开发服务器控件。

二、预备知识

在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></{0}:DatePicker>")]

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 DatePickerButtonNa

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有