|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。visual|服务器|控件|日期 1、叙言
VisualC#.net是微软公司出品的一种新的编程言语(以下简称C#),它承继了C言语的一些特征,也到场了一些新的元素。之前用过Delphi开辟程序的人大概刚入手下手利用C#的时分,对其有一种素昧平生的感到(最少包含我)。是的,C#言语的开创人恰是之前在Borland公司开辟出Delphi言语的AndersHejlsberg。在我入手下手利用C#开辟程序时,就以为它是一款很棒的开辟WindowsForm&Web程序的RAD工具。
在开辟Web程序方面,C#的呈现冲破了之前的网页开辟形式,完成了与开辟Windows
Form程序一样的所见即所得的功效。C#供应了一些经常使用的WebFormControl供开辟职员利用,而且只需将控件拖进页面中便可,十分复杂。但偶然这些控件也不克不及满意开辟职员的必要,必要开辟职员本人编写用户控件(UserControl)或自界说控件(CustomControl)来满意需求。在这里,我将解说怎样在C#中开辟服务器控件。
2、准备常识
在C#中能够开辟两种服务器控件,一个是用户控件(UserControl)和自界说控件(CustomControl)。用户控件的实质与页面文件(ASPx文件)差未几,是可被别的aspx页面反复利用的HTML代码段,固然它也包含背景代码(Code-behind),后缀名是ascx。以是在开辟一些公用的静态页面时(比方页头,页脚)常常用到,但它的弱点是不容易承继,不容易分发,没法编译成二进制代码来举行部署。可是自界说控件的功效就壮大很多,它能够被编译成二进制代码(DLL文件),能够被扩大、承继、分发。就像WebFormControl一样,实在它们每一个控件就是一个DLL文件。
开辟用户控件对照复杂,就像编写一个aspx页面一样,在这里就不先容了。本文工具是自界说控件。服务器控件的基类是System.Web.UI.Control。假如要开辟可视化的服务器控件,那我们必要从System.Web.UI.WebControls来承继,不然从System.Web.UI.Control承继。
服务器控件在计划时以runat=”server”剧本代码嵌进到aspx文件中来暗示此控件是在服务器端运转的。在服务器控件地点页面提交回传(PostBack)过程当中是依托ViewState(视图形态)来保护控件形态的。以是我们在计划服务器控件属性时,其值应保留在ViewState中。
3、代码编写
C#中有一个日历控件Calendar,可是如今我必要一个能够下拉的日历控件,而且初始时不显现日历,当我点击下拉按钮时才弹出,而且中选择了日期,日历会主动埋没且选择的日期值会显现到响应的输出框中。明显Calendar控件不克不及满意我的必要,可是稍后我会在我的自界说控件顶用到它。
起首新建项目,在项目范例当选择VisualC#项目,在模板列表当选择Web控件库,输出项目称号AquaCalendar,然后选择项目地点目次,点击【断定】按钮。C#将会天生基础的框架代码。将项目中的类文件和类名更名为DatePicker(克日期控件的类名)。因为DatePicker是可视化控件,以是我们必需从System.Web.UI.WebControls承继。而且它包含一个输出框,一个按钮和日历控件,必要在DatePicker类中声明它们。像这类以多个服务器控件组合的控件成为复合控件。代码以下,对照主要的办法和代码在正文中会加以申明:
<P>usingSystem;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.ComponentModel;
usingSystem.Drawing;
namespaceAquaCalendar
{
[DefaultProperty("Text"),//在属性工具箱中显现的默许属性
ToolboxData("<{0}:DatePickerrunat=server>")]
publicclassDatePicker:System.Web.UI.WebControls.WebControl,IPostBackEventHandler
{
//选择日期按钮的默许款式
privateconststring_BUTTONDEFAULTSTYLE="BORDER-RIGHT:gray1pxsolid;BORDER-TOP:gray1pxsolid;BORDER-LEFT:gray1pxsolid;CURSOR:hand;BORDER-BOTTOM:gray1pxsolid;";
//按钮默许文本
privateconststring_BUTTONDEFAULTTEXT="...";
privateSystem.Web.UI.WebControls.Calendar_Calendar;
publicoverrideControlCollectionControls
{
get
{
EnsureChildControls();//确认子控件集都已被创立
returnbase.Controls;
}
}
//创立子控件(服务器日历控件)
protectedoverridevoidCreateChildControls()
{
Controls.Clear();
_Calendar=newCalendar();
_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+=newEventHandler(_Calendar_SelectionChanged);
this.Controls.Add(_Calendar);
}
[
Category("Appearance"),//该属性所属种别,拜见图
DefaultValue(""),//属性默许值
Description("设置该日期控件的值。")//属性的形貌
]
publicstringText
{
get
{
EnsureChildControls();
return(ViewState["Text"]==null)?System.DateTime.Today.ToString("yyyy-MM-dd"):ViewState["Text"].ToString();
}
set
{
EnsureChildControls();
DateTimedt=System.DateTime.Today;
try
{
dt=DateTime.Parse(value);
}
catch
{
thrownewArgumentOutOfRangeException("请输出日期型字符串(比方:1981-04-29)!");
}
ViewState["Text"]=DateFormat==CalendarEnum.LongDateTime?dt.ToString("yyyy-MM-dd"):dt.ToString("yyyy-M-d");
}
}
//重载服务器控件的Enabled属性,将选择日期按钮变灰(禁用)
publicoverrideboolEnabled
{
get
{
EnsureChildControls();
returnViewState["Enabled"]==null?true:(bool)ViewState["Enabled"];
}
set
{
EnsureChildControls();
ViewState["Enabled"]=value;
}
}
publicstringButtonStyle
{
get
{
EnsureChildControls();
objecto=ViewState["ButtonSytle"];
return(o==null)?_BUTTONDEFAULTSTYLE:o.ToString();
}
set
{
EnsureChildControls();
ViewState["ButtonSytle"]=value;
}
}
[
DefaultValue(CalendarEnum.LongDateTime),
]
publicCalendarEnumDateFormat
{
get
{
EnsureChildControls();
objectformat=ViewState["DateFormat"];
returnformat==null?CalendarEnum.LongDateTime:(CalendarEnum)format;
}
set
{
EnsureChildControls();
ViewState["DateFormat"]=value;
DateTimedt=DateTime.Parse(Text);
Text=DateFormat==CalendarEnum.LongDateTime?dt.ToString("yyyy-MM-dd"):dt.ToString("yyyy-M-d");
}
}
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
publicstringMyCalendarID//复合控件ID
{
get
{
EnsureChildControls();
returnthis.ClientID+"_MyCalendar";
}
}
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
publicstringMyCalendarName//复合控件称号
{
get
{
EnsureChildControls();
returnthis.UniqueID+":MyCalendar";
}
}
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
publicstringDatePickerInputID//复合控件中输出框的ID
{
get
{
EnsureChildControls();
returnthis.ClientID+"_DateInput";
}
}
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
publicstringDatePickerInputName//复合控件中输出框的称号
{
get
{
EnsureChildControls();
returnthis.UniqueID+":DateInput";
}
}
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
publicstringDatePickerButtonID//复合控件中按钮的ID
{
get
{
EnsureChildControls();
returnthis.ClientID+"_DateButton";
}
}
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
publicstringDatePickerButtonName//复合控件中按钮的称号
{
get
{
EnsureChildControls();
returnthis.UniqueID+":DateButton";
}
}
publicstringButtonText
{
get
{
EnsureChildControls();
returnViewState["ButtonText"]==null?_BUTTONDEFAULTTEXT:(string)ViewState["ButtonText"];
}
set
{
EnsureChildControls();
ViewState["ButtonText"]=value;
}
}
///
///将此控件出现给指定的输入参数。
///
///要写出到的HTML编写器
protectedoverridevoidRender(HtmlTextWriteroutput)
{
//在页面中输入控件时,发生一个表格(二行二列),以下是表格的款式
output.AddAttribute(HtmlTextWriterAttribute.Cellspacing,"0");
output.AddAttribute(HtmlTextWriterAttribute.Border,"0");
output.AddAttribute(HtmlTextWriterAttribute.Cellpadding,"0");
output.AddStyleAttribute("LEFT",this.Style["LEFT"]);
output.AddStyleAttribute("TOP",this.Style["TOP"]);
output.AddStyleAttribute("POSITION","absolute");
if(Width!=Unit.Empty)
{
output.AddStyleAttribute(HtmlTextWriterStyle.Width,Width.ToString());
}
else
{
output.AddStyleAttribute(HtmlTextWriterStyle.Width,"200px");
}
output.RenderBeginTag(HtmlTextWriterTag.Table);//输入表格
output.RenderBeginTag(HtmlTextWriterTag.Tr);//表格第一行
output.AddAttribute(HtmlTextWriterAttribute.Width,"90%");
output.RenderBeginTag(HtmlTextWriterTag.Td);
//以下是第一行第一列中文本框的属性及其款式设置
if(!Enabled)
{
output.AddAttribute(HtmlTextWriterAttribute.ReadOnly,"true");
}
output.AddAttribute(HtmlTextWriterAttribute.Type,"Text");
output.AddAttribute(HtmlTextWriterAttribute.Id,DatePickerInputID);
output.AddAttribute(HtmlTextWriterAttribute.Name,DatePickerInputName);
output.AddAttribute(HtmlTextWriterAttribute.Value,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(HtmlTextWriterStyle.FontWeight,Font.Bold?"bold":"");
output.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor,ColorTranslator.ToHtml(BackColor));
output.AddStyleAttribute(HtmlTextWriterStyle.Color,ColorTranslator.ToHtml(ForeColor));
output.RenderBeginTag(HtmlTextWriterTag.Input);//输入文本框
output.RenderEndTag();
output.RenderEndTag();
output.AddAttribute(HtmlTextWriterAttribute.Width,"*");
output.RenderBeginTag(HtmlTextWriterTag.Td);
//以下是第一行第二列中按钮的属性及其款式设置
if(!Enabled)
{
output.AddAttribute(HtmlTextWriterAttribute.Disabled,"true");
}
output.AddAttribute(HtmlTextWriterAttribute.Type,"Submit");
output.AddAttribute(HtmlTextWriterAttribute.Id,DatePickerButtonID);
output.AddAttribute(HtmlTextWriterAttribute.Name,DatePickerButtonName);
output.AddAttribute(HtmlTextWriterAttribute.Value,ButtonText);
output.AddStyleAttribute(HtmlTextWriterStyle.Width,"100%");
output.AddAttribute(HtmlTextWriterAttribute.Onclick,Page.GetPostBackEventReference(this));//点击按钮时必要回传服务器来触发前面的OnClick事务
output.AddAttribute(HtmlTextWriterAttribute.Style,ButtonStyle);
output.RenderBeginTag(HtmlTextWriterTag.Input);//输入按钮
output.RenderEndTag();
output.RenderEndTag();
output.RenderEndTag();
output.RenderBeginTag(HtmlTextWriterTag.Tr);
output.AddAttribute(HtmlTextWriterAttribute.Colspan,"2");
output.RenderBeginTag(HtmlTextWriterTag.Td);
_Calendar.RenderControl(output);//将日历子控件输入
output.RenderEndTag();
output.RenderEndTag();
output.RenderEndTag();
}
//复合控件必需承继IpostBackEventHandler接口,才干承继RaisePostBackEvent事务
publicvoidRaisePostBackEvent(stringeventArgument)
{
OnClick(EventArgs.Empty);
}
protectedvirtualvoidOnClick(EventArgse)
{
//点击选择日期按钮时,假如日历子控件没有显现则显现出来并将文本框的值赋值给日历子控件
if(_Calendar.Attributes["display"]!="")
{
_Calendar.SelectedDate=DateTime.Parse(Text);
_Calendar.Style.Add("display","");
}
}
//复合控件中的日历控件日期变更事务
privatevoid_Calendar_SelectionChanged(objectsender,EventArgse)
{
//中选择的日期变更时,将所选日期赋值给文本框并将日历子控件埋没
Text=_Calendar.SelectedDate.ToString();
_Calendar.Style.Add("display","none");
}
}
}
在下面的代码中,必要注重以下几点:
・假如你想将此控件的某些属性供重载,则在声明属性前加上virtual关头字;
・在页面输入此控件时(即在Render事务中),是先界说子控件的款式或属性,然后再发生子控件;
・在埋没日历子控件时,倡议不要利用Visible属性来显现/埋没,利用Visible=false埋没时服务器端将不会将日历控件HTML代码发送给客户端,会招致复合控件装载日历控件的表格会空缺一块出来,影响页面的结构。以是利用款式display=none设置来使日历控件在客户端埋没,可是HTML代码仍然存在于页面中;
4、停止语
在编写服务器控件时,必要必定的HTML言语基本,也要分明.NET程序的哀求处置体例。服务器控件封装了客户端举动及逻辑判别,无需开辟者增加更多代码。固然,有些中央利用服务器控件能够带来便利,可是也增添了服务器的负荷。偶然得当的分离JavaScript使一些代码在客户端运转,可进步WEB使用程序效力那做企业软件是不是最好用J2EE? |
|