DatePicker(日期選擇自定義服務(wù)器控件)的實(shí)現(xiàn)
2024-07-21 02:23:23
供稿:網(wǎng)友
在dotnet中有用戶自定義控件(.ascx)和服務(wù)器控件(程序代碼)
webcontrol 類提供所有 web 服務(wù)器控件的公共屬性、方法和事件。通過設(shè)置在此類中定義的屬性,可以控制 web 服務(wù)器控件的外觀和行為。
例如在community中datepicker控件的實(shí)現(xiàn)
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 {
//確定服務(wù)器控件是否包含子控件。如果不包含,則創(chuàng)建子控件。
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>
/// 通知使用基于合成的實(shí)現(xiàn)的服務(wù)器控件創(chuàng)建它們包含的任何子控件,以便為回發(fā)或呈現(xiàn)做準(zhǔn)備。
/// 當(dāng)開發(fā)復(fù)合服務(wù)器控件或模板服務(wù)器控件時(shí),必須重寫此方法。
/// </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>
/// 將服務(wù)器控件內(nèi)容發(fā)送到提供的 htmltextwriter 對象,此對象編寫將在客戶端呈現(xiàn)的內(nèi)容。
/// 在開發(fā)自定義服務(wù)器控件時(shí),可以重寫此方法以生成 asp.net 頁的內(nèi)容。
/// </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); //將服務(wù)器控件子級的內(nèi)容輸出到提供的 htmltextwriter 對象,
//此對象編寫將在客戶端呈現(xiàn)的內(nèi)容。
else
if (datepart.startswith("d"))
dropday.rendercontrol(tw);
else
dropyear.rendercontrol(tw);
}
}