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);
}
}