[System.Web.UI.ValidationProperty("SelectedDate")]
public partial class DropDownDatePicker : Microsoft.Practices.CompositeWeb.Web.UI.UserControl, IDropDownDatePickerWebPartView
{
private DropDownDatePickerWebPartPresenter _presenter;
private DateTime dateOfBirth;
public DateTime? SelectedDate
{
get
{
DateTime result;
if (DateTime.TryParse(String.Format("{0}/{1}/{2}", this.ddlYear.SelectedValue, this.ddlMonth.SelectedIndex, this.ddlDay.SelectedValue), out result)) return result;
else return null;
}
}
public DateTime DateOfBirth { set { dateOfBirth = value; } }
public DateTime MinDate { get; set; }
public DateTime MaxDate { get; set; }
public bool ValidationEnabled { get; set; }
[Dependency]
public DropDownDatePickerWebPartPresenter Presenter
{
get
{
return this._presenter;
}
set
{
if (value == null)
throw new ArgumentNullException("value");
this._presenter = value;
this._presenter.View = this;
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (MaxDate == DateTime.MinValue)
{
MinDate = DateTime.Now.AddYears(-100);
MaxDate = DateTime.Now;
}
if (!this.IsPostBack)
{
this._presenter.OnViewInitialized();
rfvDateOfBirth.Enabled = ValidationEnabled;
BindLists();
BindSelections();
}
this._presenter.OnViewLoaded();
}
#region Binds
private void BindLists()
{
ddlDay.DataSource = GetDays(dateOfBirth.Year, dateOfBirth.Month);
ddlDay.DataBind();
ddlMonth.DataSource = GetMonths();
ddlMonth.DataBind();
ddlYear.DataSource = GetYears();
ddlYear.DataBind();
}
private void RebindDays()
{
int year;
var month = ddlMonth.SelectedIndex;
var currentday = ddlDay.SelectedValue;
if (ddlYear.SelectedIndex == 0) year = DateTime.Now.Year;
else int.TryParse(ddlYear.SelectedValue, out year);
if (year <= MaxDate.Year
&& year >= MinDate.Year
&& month > 0
&& month <= 12)
{
ddlDay.DataSource = GetDays(year, month);
ddlDay.DataBind();
if (ddlDay.Items.FindByValue(currentday) != null) ddlDay.SelectedValue = currentday;
}
}
private void BindSelections()
{
if (dateOfBirth != DateTime.MinValue)
{
this.ddlYear.SelectedValue = dateOfBirth.Year.ToString();
this.ddlMonth.SelectedIndex = dateOfBirth.Month;
this.ddlDay.SelectedValue = dateOfBirth.Day.ToString();
}
}
#endregion
#region Get Lists
private List<string> GetDays(int year, int month)
{
var days = new List<string>();
days.Add("-Day-");
while (days.Count <= DateTime.DaysInMonth(year, month)) days.Add(days.Count.ToString());
return days;
}
/// <summary>
/// We'll can still use Months as List<string> if we use Index for the Int when creating DateTime objects
/// </summary>
/// <returns></returns>
private List<string> GetMonths()
{
var months = new List<string>();
months.Add("-Month-");
while (months.Count <= 12) months.Add(new DateTime(2001, months.Count, 1).ToString("MMMM"));
return months;
}
private List<string> GetYears()
{
var years = new List<string>();
years.Add("-Year-");
int thisyear = MaxDate.Year;
int floor = MinDate.Year;
while (thisyear > floor) years.Add(thisyear--.ToString());
return years;
}
#endregion
#region Events
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
RebindDays();
Validate();
}
#endregion
#region Validation
private void Validate()
{
if (ValidationEnabled)
{
try
{
int year = Convert.ToInt16(this.ddlYear.SelectedValue);
int month = Convert.ToInt16(this.ddlMonth.SelectedIndex);
int day = Convert.ToInt16(this.ddlDay.SelectedValue);
DateTime d = new DateTime(year, month, day);
if (d > MaxDate || d < MinDate)
{
throw new Exception(String.Format("Server Side DropDownDatePicker.Validate: Date {0} not in valid range {1} - {2}",
d.ToShortDateString(), MinDate.ToShortDateString(), MaxDate.ToShortDateString()));
}
}
catch (Exception e)
{
//log...
txtDobValid.Text = String.Empty;
rfvDateOfBirth.IsValid = false;
// leave parent to validate page
}
}
}
#endregion
}
}