用Visual-C.NET编写服务器日期控件_第1页
用Visual-C.NET编写服务器日期控件_第2页
用Visual-C.NET编写服务器日期控件_第3页
用Visual-C.NET编写服务器日期控件_第4页
用Visual-C.NET编写服务器日期控件_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用Visual C#.NET编写服务器日期控件一、序言Visual HYPERLINK /dotnet/csharp/ t _blank C# HYPERLINK /dotnet/ t _blank .net是微软公司出品的一种新的编程语言(以下简称C#),它继承了C语言的一些特性,也加入了一些新的元素。以前用过 HYPERLINK /language/delphi/ t _blank Delphi开发程序的人可能刚开始使用C#的时候,对其有一种似曾相识的感觉(至少包括我)。是的,C#语言的创始人正是以前在Borland公司开发出Delphi语言的Anders Hejlsberg。在我开始使用

2、C#开发程序时,就觉得它是一款很棒的开发 HYPERLINK /os/windows/ t _blank Windows Form & HYPERLINK /web/ t _blank Web程序的RAD工具。 在开发Web程序方面,C#的出现打破了以前的网页开发模式,实现了与开发Windows Form程序一样的所见即所得的功能。C#提供了一些常用的Web Form Control供开发人员使用,并且只需将控件拖入页面中即可,非常简单。但有时这些控件也不能满足开发人员的需要,需要开发人员自己编写用户控件(User Control)或自定义控件(Custom Control)来满足需求。在这里

3、,我将讲解如何在C#中开发 HYPERLINK /server/ t _blank 服务器控件。二、预备知识在C#中可以开发两种服务器控件,一个是用户控件(User Control)和自定义控件(Custom Control)。用户控件的本质与页面文件( HYPERLINK /web/asp/ t _blank ASPx文件)差不多,是可被其它aspx页面重复使用的HTML代码段,当然它也包括后台代码(Code-behind),后缀名是ascx。所以在开发一些公用的静态页面时(例如页头,页脚)经常用到,但它的缺点是不易继承,不易分发,无法编译成二进制代码来进行部署。但是自定义控件的功能就强大许

4、多,它可以被编译成二进制代码(DLL文件),可以被扩展、继承、分发。就像Web Form Control一样,其实它们每个控件就是一个DLL文件。开发用户控件比较简单,就像编写一个aspx页面一样,在这里就不介绍了。本文对象是自定义控件。服务器控件的基类是System.Web.UI.Control。如果要开发可视化的服务器控件,那我们需要从System.Web.UI. HYPERLINK /dotnet/aspnet/webcontrols/ t _blank WebControls来继承,否则从System.Web.UI.Control继承。服务器控件在设计时以runat=”server”脚

5、本代码嵌入到aspx文件中来表示此控件是在服务器端运行的。在服务器控件所在页面提交回传(PostBack)过程中是依靠ViewState(视图状态)来维护控件状态的。所以我们在设计服务器控件属性时,其值应保存在ViewState中。三、代码编写C#中有一个日历控件Calendar,但是现在我需要一个可以下拉的日历控件,并且初始时不显示日历,当我点击下拉按钮时才弹出,并且当选择了日期,日历会自动隐藏且选择的日期值会显示到相应的输入框中。显然Calendar控件不能满足我的需要,但是稍后我会在我的自定义控件中用到它。首先新建项目,在项目类型中选择Visual C#项目,在模板列表中选择Web控件库

6、,输入项目名称AquaCalendar,然后选择项目所在目录,点击【确定】按钮。C#将会生成基本的框架代码。将项目中的类文件和类名改名为DatePicker(即日期控件的类名)。由于DatePicker是可视化控件,所以我们必须从System.Web.UI.WebControls继承。并且它包括一个输入框,一个按钮和日历控件,需要在DatePicker类中声明它们。像这种以多个服务器控件组合的控件成为复合控件。代码如下,比较重要的方法和代码在注释中会加以说明:using System;using System.Web.UI;using System.Web.UI.WebControls;usi

7、ng System.ComponentModel;using System.Drawing;namespace AquaCalendarDefaultProperty(Text), /在属性工具箱中显示的默认属性ToolboxData()public class DatePicker : System.Web.UI.WebControls.WebControl , IPostBackEventHandler/选择日期按钮的默认样式private const string _BUTTONDEFAULTSTYLE = BORDER-RIGHT: gray 1px solid; BORDER-TOP

8、: 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 ControlsgetEnsureChildControls(); /确认子控件集都已被创建return base.Controls;/创建子

9、控件(服务器日历控件)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;_

10、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.TodayDaySt

11、yle.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

12、 = 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;_Cal

13、endar.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.CustomTe

14、xt;_Calendar.NextMonthText = 下月;_Calendar.PrevMonthText = 上月;_Calendar.Style.Add(display,none); /默认不显示下拉日历控件_Calendar.SelectionChanged += new EventHandler(_Calendar_SelectionChanged);this.Controls.Add(_Calendar);Category(Appearance), /该属性所属类别,参见图DefaultValue(), /属性默认值Description(设置该日期控件的值。) /属性的描述pu

15、blic string TextgetEnsureChildControls();return (ViewStateText = null)?System.DateTime.Today.ToString(yyyy-MM-dd):ViewStateText.ToString();setEnsureChildControls();DateTime dt = System.DateTime.Today;trydt = DateTime.Parse(value);catchthrow new ArgumentOutOfRangeException(请输入日期型字符串(例如:1981-04-29)!);

16、ViewStateText = DateFormat = CalendarEnum.LongDateTime?dt.ToString(yyyy-MM-dd):dt.ToString(yyyy-M-d);/重载服务器控件的Enabled属性,将选择日期按钮变灰(禁用)public override bool EnabledgetEnsureChildControls();return ViewStateEnabled = null?true:(bool)ViewStateEnabled;setEnsureChildControls();ViewStateEnabled = value;publi

17、c string ButtonStylegetEnsureChildControls();object o = ViewStateButtonSytle;return (o = null)?_BUTTONDEFAULTSTYLE:o.ToString();setEnsureChildControls();ViewStateButtonSytle = value;DefaultValue(CalendarEnum.LongDateTime),public CalendarEnum DateFormatgetEnsureChildControls();object format = ViewSta

18、teDateFormat;return format = null?CalendarEnum.LongDateTime:(CalendarEnum)format;setEnsureChildControls();ViewStateDateFormat = value;DateTime dt = DateTime.Parse(Text);Text=DateFormat = CalendarEnum.LongDateTime?dt.ToString(yyyy-MM-dd):dt.ToString(yyyy-M-d);Browsable(false),DesignerSerializationVis

19、ibility(DesignerSerializationVisibility.Hidden)public string MyCalendarID /复合控件IDgetEnsureChildControls();return this.ClientID+_MyCalendar;Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)public string MyCalendarName /复合控件名称getEnsureChildControls();return this.

20、UniqueID+:MyCalendar;Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)public string DatePickerInputID /复合控件中输入框的IDgetEnsureChildControls();return this.ClientID+_DateInput;Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)pu

21、blic string DatePickerInputName /复合控件中输入框的名称getEnsureChildControls();return this.UniqueID+:DateInput;Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)public string DatePickerButtonID /复合控件中按钮的IDgetEnsureChildControls();return this.ClientID+_DateButton;Browsable

22、(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)public string DatePickerButtonName /复合控件中按钮的名称getEnsureChildControls();return this.UniqueID+:DateButton;public string ButtonTextgetEnsureChildControls();return ViewStateButtonText = null?_BUTTONDEFAULTTEXT:(string)ViewSta

23、teButtonText;setEnsureChildControls();ViewStateButtonText = value;/ / 将此控件呈现给指定的输出参数。/ / 要写出到的 HTML 编写器 protected override void Render(HtmlTextWriter output)/在页面中输出控件时,产生一个表格(二行二列),以下是表格的样式output.AddAttribute(HtmlTextWriterAttribute.Cellspacing, 0);output.AddAttribute(HtmlTextWriterAttribute.Border,

24、 0);output.AddAttribute(HtmlTextWriterAttribute.Cellpadding, 0);output.AddStyleAttribute(LEFT, this.StyleLEFT);output.AddStyleAttribute(TOP, this.StyleTOP);output.AddStyleAttribute(POSITION, absolute);if (Width != Unit.Empty)output.AddStyleAttribute(HtmlTextWriterStyle.Width, Width.ToString();elseou

25、tput.AddStyleAttribute(HtmlTextWriterStyle.Width, 200px);output.RenderBeginTag(HtmlTextWriterTag.Table); /输出表格output.RenderBeginTag(HtmlTextWriterTag.Tr); /表格第一行output.AddAttribute(HtmlTextWriterAttribute.Width, 90%);output.RenderBeginTag(HtmlTextWriterTag.Td);/以下是第一行第一列中文本框的属性及其样式设置if (!Enabled)out

26、put.AddAttribute(HtmlTextWriterAttribute.ReadOnly, true);output.AddAttribute(HtmlTextWriterAttribute.Type, Text);output.AddAttribute(HtmlTextWriterAttribute.Id, DatePickerInputID);output.AddAttribute(HtmlTextWriterAttribute.Name, DatePickerInputName);output.AddAttribute(HtmlTextWriterAttribute.Value

27、, 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(HtmlTe

28、xtWriterStyle.FontWeight, Font.Bold?bold:);output.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, ColorTranslator.ToHtml(BackColor);output.AddStyleAttribute(HtmlTextWriterStyle.Color, ColorTranslator.ToHtml(ForeColor);output.RenderBeginTag(HtmlTextWriterTag.Input); /输出文本框output.RenderEndTag()

29、;output.RenderEndTag();output.AddAttribute(HtmlTextWriterAttribute.Width, *);output.RenderBeginTag(HtmlTextWriterTag.Td);/以下是第一行第二列中按钮的属性及其样式设置if (!Enabled)output.AddAttribute(HtmlTextWriterAttribute.Disabled, true);output.AddAttribute(HtmlTextWriterAttribute.Type, Submit);output.AddAttribute(HtmlTe

30、xtWriterAttribute.Id, DatePickerButtonID);output.AddAttribute(HtmlTextWriterAttribute.Name, DatePickerButtonName);output.AddAttribute(HtmlTextWriterAttribute.Value, ButtonText);output.AddStyleAttribute(HtmlTextWriterStyle.Width, 100%);output.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.GetPost

31、BackEventReference(this); /点击按钮时需要回传服务器来触发后面的OnClick事件output.AddAttribute(HtmlTextWriterAttribute.Style, ButtonStyle);output.RenderBeginTag(HtmlTextWriterTag.Input); /输出按钮output.RenderEndTag();output.RenderEndTag();output.RenderEndTag();output.RenderBeginTag(HtmlTextWriterTag.Tr);output.AddAttribute

32、(HtmlTextWriterAttribute.Colspan, 2);output.RenderBeginTag(HtmlTextWriterTag.Td);_Calendar.RenderControl(output); /将日历子控件输出output.RenderEndTag();output.RenderEndTag();output.RenderEndTag();/复合控件必须继承IpostBackEventHandler接口,才能继承RaisePostBackEvent事件public void RaisePostBackEvent(string eventArgument)On

33、Click(EventArgs.Empty);protected virtual void OnClick(EventArgs e)/点击选择日期按钮时,如果日历子控件没有显示则显示出来并将文本框的值赋值给日历子控件if (_Calendar.Attributesdisplay != )_Calendar.SelectedDate = DateTime.Parse(Text);_Calendar.Style.Add(display,);/复合控件中的日历控件日期变化事件private void _Calendar_SelectionChanged(object sender, EventArg

34、s e)/当选择的日期变化时,将所选日期赋值给文本框并将日历子控件隐藏Text = _Calendar.SelectedDate.ToString();_Calendar.Style.Add(display,none);在上面的代码中,需要注意以下几点:如果你想将此控件的某些属性供重载,则在声明属性前加上virtual关键字;在页面输出此控件时(即在Render事件中),是先定义子控件的样式或属性,然后再产生子控件;在隐藏日历子控件时,建议不要使用Visible属性来显示/隐藏,使用Visible=false隐藏时服务器端将不会将日历控件HTML代码发送给客户端,会导致复合控件装载日历控件的表

35、格会空白一块出来,影响页面的布局。所以使用样式display=none设置来使日历控件在客户端隐藏,但是HTML代码依然存在于页面中;四、结束语在编写服务器控件时,需要一定的HTML语言基础,也要清楚.NET程序的请求处理方式。服务器控件封装了客户端行为及逻辑判断,无需开发者添加更多代码。当然,有些地方使用服务器控件可以带来方便,但是也增加了服务器的负荷。有时适当的结合 HYPERLINK /web/javascript/ t _blank JavaScript使一些代码在客户端运行,可提高WEB应用程序效率。附录资料:不需要的可以自行删除Abstract: Based on the comp

36、rehensive analysis on the plastic parts structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was designed. By adopting the multi-direction and multi-combination core-pulling. A corresponding injection mould of in

37、ternal side core pulling was designed, the working process of the mould was introducedC语言详解 - 枚举类型注:以下全部代码的执行环境为VC+ 6.0在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:#define MON 1#define TUE 2#define WED 3#define THU 4#define FRI 5#define SAT 6#define SUN 7在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类

38、型叫枚举型。1. 定义一种新的数据类型 - 枚举型 以下代码定义了这种新的数据类型 - 枚举型enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN;(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。(5) 枚举型是预处理指令#define的替代。(6) 类型定义以分号;结束。2. 使用枚举类型对

39、变量进行声明新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样:char a; /变量a的类型均为字符型charchar letter;int x, y, z; /变量x,y和z的类型均为整型intint number;double m, n;double result; /变量result的类型为双精度浮点型double既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。方法一:枚举类型的定义和变量的声明分

40、开enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN;enum DAY yesterday;enum DAY today;enum DAY tomorrow; /变量tomorrow的类型为枚举型enum DAYenum DAY good_day, bad_day; /变量good_day和bad_day的类型均为枚举型enum DAY方法二:类型定义与变量声明同时进行:enum /跟第一个定义不同的是,此处的标号DAY省略,这是允许的。 saturday, sunday = 0, monday, tuesday, wednesday, thursday,

41、 friday workday; /变量workday的类型为枚举型enum DAYenum week Mon=1, Tue, Wed, Thu, Fri Sat, Sun days; /变量days的类型为枚举型enum weekenum BOOLEAN false, true end_flag, match_flag; /定义枚举类型并声明了两个枚举型变量方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:typedef enum workday saturday, sunday = 0, monday, tuesday, wednesday, thursday,

42、 friday workday; /此处的workday为枚举型enum workday的别名workday today, tomorrow; /变量today和tomorrow的类型为枚举型workday,也即enum workdayenum workday中的workday可以省略:typedef enum saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /此处的workday为枚举型enum workday的别名workday today, tomorrow; /变量today和tom

43、orrow的类型为枚举型workday,也即enum workday也可以用这种方式:typedef enum workday saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday;workday today, tomorrow; /变量today和tomorrow的类型为枚举型workday,也即enum workday注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:错误声明一:存在同名的枚举类型typedef enum wednesday, thursday

44、, friday workday;typedef enum WEEK saturday, sunday = 0, monday, workday; 错误声明二:存在同名的枚举成员typedef enum wednesday, thursday, friday workday_1;typedef enum WEEK wednesday, sunday = 0, monday, workday_2;3. 使用枚举类型的变量3.1 对枚举型的变量赋值。实例将枚举类型的赋值与基本数据类型的赋值进行了对比:方法一:先声明变量,再对变量赋值#include/* 定义枚举类型 */enum DAY MON=

45、1, TUE, WED, THU, FRI, SAT, SUN ;void main() /* 使用基本数据类型声明变量,然后对变量赋值 */ int x, y, z; x = 10; y = 20; z = 30; /* 使用枚举类型声明变量,再对枚举型变量赋值 */ enum DAY yesterday, today, tomorrow; yesterday = MON; today = TUE; tomorrow = WED; printf(%d %d %d n, yesterday, today, tomorrow);方法二:声明变量的同时赋初值#include /* 定义枚举类型 *

46、/enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;void main() /* 使用基本数据类型声明变量同时对变量赋初值 */ int x=10, y=20, z=30; /* 使用枚举类型声明变量同时对枚举型变量赋初值 */ enum DAY yesterday = MON, today = TUE, tomorrow = WED; printf(%d %d %d n, yesterday, today, tomorrow);方法三:定义类型的同时声明变量,然后对变量赋值。#include /* 定义枚举类型,同时声明该类型的三个变量,它们都为全局

47、变量 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN yesterday, today, tomorrow;/* 定义三个具有基本数据类型的变量,它们都为全局变量 */int x, y, z;void main() /* 对基本数据类型的变量赋值 */ x = 10; y = 20; z = 30; /* 对枚举型的变量赋值 */ yesterday = MON; today = TUE; tomorrow = WED; printf(%d %d %d n, x, y, z); /输出:10 20 30 printf(%d %d %d n, yes

48、terday, today, tomorrow); /输出:1 2 3方法四:类型定义,变量声明,赋初值同时进行。#include /* 定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN yesterday = MON, today = TUE, tomorrow = WED;/* 定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量 */int x = 10, y = 20, z = 30;void main() printf(%d %d %d n, x, y, z); /输

49、出:10 20 30 printf(%d %d %d n, yesterday, today, tomorrow); /输出:1 2 33.2 对枚举型的变量赋整数值时,需要进行类型转换。#include enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;void main() enum DAY yesterday, today, tomorrow; yesterday = TUE; today = (enum DAY) (yesterday + 1); /类型转换 tomorrow = (enum DAY) 30; /类型转换 /tomorrow =

50、 3; /错误 printf(%d %d %d n, yesterday, today, tomorrow); /输出:2 3 303.3 使用枚举型变量#includeenum BELL = a, BACKSPACE = b, HTAB = t, RETURN = r, NEWLINE = n, VTAB = v, SPACE = ;enum BOOLEAN FALSE = 0, TRUE match_flag;void main() int index = 0; int count_of_letter = 0; int count_of_space = 0; char str = Im Ely efod; match_flag = FALSE; for(; strindex != 0; i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论