首页 > 开发 > 综合 > 正文

DatePicker(日期选择自定义服务器控件)的实现

2024-07-21 02:23:23
字体:
来源:转载
供稿:网友

在dotnet中有用户自定义控件(.ascx)和服务器控件(程序代码)

webcontrol 类提供所有 web 服务器控件的公共属性、方法和事件。通过设置在此类中定义的属性,可以控制 web 服务器控件的外观和行为。

例如在community中datepicker控件的实现

public class datepicker : webcontrol, inamingcontainer {

dropdownlist dropmonth;

dropdownlist dropday;

dropdownlist dropyear;



public int month {

get {

if (viewstate["month"] == null)

return datetime.now.month;

else

return (int)viewstate["month"];

}

set { viewstate["month"] = value; }

}



public int day {

get {

if (viewstate["day"] == null)

return datetime.now.day;

else

return (int)viewstate["day"];

}

set { viewstate["day"] = value; }

}



public int year {

get {

if (viewstate["year"] == null)

return datetime.now.year;

else

return (int)viewstate["year"];

}

set {

viewstate["year"] = value;

}

}



public datetime date {

get {

//确定服务器控件是否包含子控件。如果不包含,则创建子控件。

ensurechildcontrols();



int _year = int32.parse(dropyear.selecteditem.value);

int _month = int32.parse(dropmonth.selecteditem.value);

int _day = int32.parse(dropday.selecteditem.value);



if (_day > datetime.daysinmonth(_year, _month) )

throw new argumentexception("invalid date!");



return new datetime

(

_year,

_month,

_day

);

}

set {

month = value.month;

day = value.day;

year = value.year;

}

}



/// <summary>

/// 通知使用基于合成的实现的服务器控件创建它们包含的任何子控件,以便为回发或呈现做准备。

/// 当开发复合服务器控件或模板服务器控件时,必须重写此方法。

/// </summary>

protected override void createchildcontrols() {

dropmonth = new dropdownlist();

controls.add(dropmonth);



dropday = new dropdownlist();

controls.add(dropday);



dropyear = new dropdownlist();

controls.add(dropyear);



if (!page.ispostback) {

// get a datetimeformatinfo object

datetimeformatinfo objdateinfo = datetimeformatinfo.currentinfo;



// display months

for (int i=1;i<objdateinfo.monthnames.length;i++)

dropmonth.items.add(new listitem(objdateinfo.getmonthname(i), i.tostring()));



// display days

for (int i=1;i<32;i++)

dropday.items.add(i.tostring());



// display years

for (int i=datetime.now.year - 5;i<datetime.now.year+5;i++)

dropyear.items.add(i.tostring());





dropmonth.items.findbyvalue(month.tostring()).selected = true;

dropday.items.findbyvalue(day.tostring()).selected = true;

dropyear.items.findbyvalue(year.tostring()).selected = true;

}



}



/// <summary>

/// 将服务器控件内容发送到提供的 htmltextwriter 对象,此对象编写将在客户端呈现的内容。

/// 在开发自定义服务器控件时,可以重写此方法以生成 asp.net 页的内容。

/// </summary>

/// <param name="tw">htmltextwriter 对象</param>

protected override void render(htmltextwriter tw) {

// get date parts

string[] dateparts;

try {

datetimeformatinfo objdateinfo = datetimeformatinfo.currentinfo;

//modify by yukh ,because in some objdateinfo.shortdatepattern seperate by "-" eg: yyyy-m-d

if (objdateinfo.shortdatepattern.indexof("/")>0)

dateparts = objdateinfo.shortdatepattern.split('/');

else

dateparts = objdateinfo.shortdatepattern.split('-');



}

catch {

dateparts = new string[]{"m","d","y"};

}

tw.renderbegintag(htmltextwritertag.table);

tw.renderbegintag(htmltextwritertag.tr);

tw.renderbegintag(htmltextwritertag.td);

renderdatepart(dateparts[0],tw);

tw.renderendtag();



tw.renderbegintag(htmltextwritertag.td);

renderdatepart(dateparts[1],tw);

tw.renderendtag();



tw.renderbegintag(htmltextwritertag.td);

renderdatepart(dateparts[2],tw);

tw.renderendtag();



tw.renderendtag(); // close row

tw.renderendtag(); // close table





}



private void renderdatepart(string datepart,htmltextwriter tw) {

datepart = datepart.tolower();



if (datepart.startswith("m"))

dropmonth.rendercontrol(tw); //将服务器控件子级的内容输出到提供的 htmltextwriter 对象,

//此对象编写将在客户端呈现的内容。

else

if (datepart.startswith("d"))

dropday.rendercontrol(tw);

else

dropyear.rendercontrol(tw);

}

}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表