用Visual C#.NET编写服务器日期控件
来源:互联网 发布:2017程序员工资待遇 编辑:程序博客网 时间:2024/06/05 15:54
一、序言
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( ), )]
public class DatePicker : System.Web.UI.WebControls.WebControl , IPostBackEventHandler
{
private const string _BUTTONDEFAULTSTYLE = ;
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( );
_Calendar.Font.Name = ;
_Calendar.SelectedDayStyle.BackColor = ColorTranslator.FromHtml( );
_Calendar.SelectedDayStyle.ForeColor = ColorTranslator.FromHtml( );
_Calendar.DayStyle.BackColor = ColorTranslator.FromHtml( );
_Calendar.TodayDayStyle.BackColor = ColorTranslator.FromHtml( );
_Calendar.TodayDayStyle.ForeColor = ColorTranslator.FromHtml( );
_Calendar.DayHeaderStyle.Font.Size = FontUnit.Parse( );
_Calendar.DayHeaderStyle.Font.Bold = true;
_Calendar.DayHeaderStyle.Height = Unit.Parse( );
_Calendar.DayHeaderStyle.ForeColor = ColorTranslator.FromHtml( );
_Calendar.NextPrevStyle.Font.Size = FontUnit.Parse( );
_Calendar.NextPrevStyle.Font.Bold = true;
_Calendar.NextPrevStyle.ForeColor = ColorTranslator.FromHtml( );
_Calendar.TitleStyle.Font.Size = FontUnit.Parse( );
_Calendar.TitleStyle.Font.Bold = true;
_Calendar.TitleStyle.Height = Unit.Parse( );
_Calendar.TitleStyle.ForeColor = ColorTranslator.FromHtml( );
_Calendar.TitleStyle.BackColor = ColorTranslator.FromHtml( );
_Calendar.OtherMonthDayStyle.ForeColor = ColorTranslator.FromHtml( );
_Calendar.NextPrevFormat = NextPrevFormat.CustomText;
_Calendar.NextMonthText = ;
_Calendar.PrevMonthText = ;
_Calendar.Style.Add( , ); new EventHandler( _Calendar_SelectionChanged );
this.Controls.Add( _Calendar );
}
[
Category( ), )
public string Text
{
get
{
EnsureChildControls( );
return ( ViewState[] == null )?System.DateTime.Today.ToString( ):ViewState[].ToString( );
}
set
{
EnsureChildControls( );
DateTime dt = System.DateTime.Today;
try
{
dt = DateTime.Parse( value );
}
catch
{
throw new ArgumentOutOfRangeException( );
}
ViewState[] = DateFormat == CalendarEnum.LongDateTime?dt.ToString( ):dt.ToString( );
}
}
public override bool Enabled
{
get
{
EnsureChildControls( );
return ViewState[] == null?true:( bool )ViewState[];
}
set
{
EnsureChildControls( );
ViewState[] = value;
}
}
public string ButtonStyle
{
get
{
EnsureChildControls( );
object o = ViewState[];
return ( o == null )?_BUTTONDEFAULTSTYLE:o.ToString( );
}
set
{
EnsureChildControls( );
ViewState[] = value;
}
}
[
DefaultValue( CalendarEnum.LongDateTime ),
]
public CalendarEnum DateFormat
{
get
{
EnsureChildControls( );
object format = ViewState[];
return format == null?CalendarEnum.LongDateTime:( CalendarEnum )format;
}
set
{
EnsureChildControls( );
ViewState[] = value;
DateTime dt = DateTime.Parse( Text );
Text=DateFormat == CalendarEnum.LongDateTime?dt.ToString( ):dt.ToString( );
}
}
[
Browsable( false ),
DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )
]
public string MyCalendarID
get
{
EnsureChildControls( );
return this.ClientID+;
}
}
[
Browsable( false ),
DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )
]
public string MyCalendarName
get
{
EnsureChildControls( );
return this.UniqueID+;
}
}
[
Browsable( false ),
DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )
]
public string DatePickerInputID
get
{
EnsureChildControls( );
return this.ClientID+;
}
}
[
Browsable( false ),
DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )
]
public string DatePickerInputName
get
{
EnsureChildControls( );
return this.UniqueID+;
}
}
[
Browsable( false ),
DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )
]
public string DatePickerButtonID
get
{
EnsureChildControls( );
return this.ClientID+;
}
}
[
Browsable( false ),
DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )
]
public string DatePickerButtonName
get
{
EnsureChildControls( );
return this.UniqueID+;
}
}
public string ButtonText
{
get
{
EnsureChildControls( );
return ViewState[] == null?_BUTTONDEFAULTTEXT:( string )ViewState[];
}
set
{
EnsureChildControls( );
ViewState[] = value;
}
}
> 要写出到的 HTML 编写器 </param>
protected override void Render( HtmlTextWriter output )
{
);
output.AddAttribute( HtmlTextWriterAttribute.Border, );
output.AddAttribute( HtmlTextWriterAttribute.Cellpadding, );
output.AddStyleAttribute( , this.Style[] );
output.AddStyleAttribute( , this.Style[] );
output.AddStyleAttribute( , );
if ( Width != Unit.Empty )
{
output.AddStyleAttribute( HtmlTextWriterStyle.Width, Width.ToString( ) );
}
else
{
output.AddStyleAttribute( HtmlTextWriterStyle.Width, );
}
output.RenderBeginTag( HtmlTextWriterTag.Table ); );
output.RenderBeginTag( HtmlTextWriterTag.Td );
if ( !Enabled )
{
output.AddAttribute( HtmlTextWriterAttribute.ReadOnly, );
}
output.AddAttribute( HtmlTextWriterAttribute.Type, );
output.AddAttribute( HtmlTextWriterAttribute.Id, DatePickerInputID );
output.AddAttribute( HtmlTextWriterAttribute.Name, DatePickerInputName );
output.AddAttribute( HtmlTextWriterAttribute.Value, Text );
output.AddStyleAttribute( HtmlTextWriterStyle.Width, );
output.AddStyleAttribute( HtmlTextWriterStyle.Height, );
output.AddStyleAttribute( HtmlTextWriterStyle.FontFamily, Font.Name );
output.AddStyleAttribute( HtmlTextWriterStyle.FontSize, Font.Size.ToString( ) );
output.AddStyleAttribute( HtmlTextWriterStyle.FontWeight, Font.Bold?: );
output.RenderBeginTag( HtmlTextWriterTag.Td );
if ( !Enabled )
{
output.AddAttribute( HtmlTextWriterAttribute.Disabled, );
}
output.AddAttribute( HtmlTextWriterAttribute.Type, );
output.AddAttribute( HtmlTextWriterAttribute.Id, DatePickerButtonID );
output.AddAttribute( HtmlTextWriterAttribute.Name, DatePickerButtonName );
output.AddAttribute( HtmlTextWriterAttribute.Value, ButtonText );
output.AddStyleAttribute( HtmlTextWriterStyle.Width, );
output.AddAttribute( HtmlTextWriterAttribute.Onclick, Page.GetPostBackEventReference( this ) );
output.AddAttribute( HtmlTextWriterAttribute.Style, ButtonStyle );
output.RenderBeginTag( HtmlTextWriterTag.Input );
output.RenderEndTag( );
output.RenderEndTag( );
output.RenderBeginTag( HtmlTextWriterTag.Tr );
output.AddAttribute( HtmlTextWriterAttribute.Colspan, );
output.RenderBeginTag( HtmlTextWriterTag.Td );
_Calendar.RenderControl( output );
output.RenderEndTag( );
output.RenderEndTag( );
}
public void RaisePostBackEvent( string eventArgument )
{
OnClick( EventArgs.Empty );
}
protected virtual void OnClick( EventArgs e )
{
if ( _Calendar.Attributes[] != DateTime.Parse( Text );
_Calendar.Style.Add( ,private void _Calendar_SelectionChanged( object sender, EventArgs e )
{
_Calendar.Style.Add( , );
}
}
}
在上面的代码中,需要注意以下几点:
·如果你想将此控件的某些属性供重载,则在声明属性前加上virtual关键字;
·在页面输出此控件时(即在Render事件中),是先定义子控件的样式或属性,然后再产生子控件;
·在隐藏日历子控件时,建议不要使用Visible属性来显示/隐藏,使用Visible=false隐藏时服务器端将不会将日历控件HTML代码发送给客户端,会导致复合控件装载日历控件的表格会空白一块出来,影响页面的布局.所以使用样式display=none设置来使日历控件在客户端隐藏,但是HTML代码依然存在于页面中;
四、结束语
在编写服务器控件时,需要一定的HTML语言基?惨宄?NET程序的请求处理方式.服务器控件封装了客户端行为及逻辑判断,无需开发者添加更多代码.当然,有些地方使用服务器控件可以带来方便,但是也增加了服务器的负荷.有时适当的结合javascript使一些代码在客户端运行,可提高WEB应用程序效率
- 用Visual C#.NET编写服务器日期控件
- 用Visual C#.NET编写服务器日期控件
- 用Visual C#.NET编写服务器日期控件(转)稍做改动,运行时不会报CalendarEnum找不着错误
- 用VisualC#.NET编写服务器日期控件
- 用C#.NET 编写ActiveX(COM)控件
- VisualC#.NET编写服务器日期控件并使用(UserControl and CustomControl)
- HOW TO: 将使用 Visual C#.NET 序列化为 Web 服务器控件
- 用Visual C#编写屏幕保护程序
- 用Visual C#编写屏幕保护程序
- 用Visual C#编写屏幕保护程序
- 用Visual C#编写屏幕保护程序
- 用Visual C#编写屏幕保护程序
- 用Visual Basic.NET编写扑克牌游戏
- 在 Visual Studio2008 中使用自定义 ASP.NET 服务器控件
- 使用Visual Studio .NET编写纯C程序的提示
- 使用Visual Studio .NET 2003编写纯C程序
- 使用Visual Studio .NET编写纯C程序的提示
- asp.net(c#)web服务器控件,多选框checkboxlist控件。
- JNDI
- 吃蔬菜的十大误区
- 改变你人生的32句励志言语
- 在Ubuntu 7.10 中安装飞鸽传书 IpMsg
- Net(C#)实现网页验证码功能
- 用Visual C#.NET编写服务器日期控件
- 正则表达式30分钟入门教程(第二版)
- vs.net web项目使用visual source safe进行源代码管理
- VSS+Vs2003使用手册
- VSS安装使用注意事项大全
- ObjectDataSource与GridView的分页操作
- 一步一步学习ObjectDataSource 一
- 一步一步学习ObjectDataSource 二
- 一步一步学习ObjectDataSource控件--自定义分页排序(三)