首先看看效果:
年与月的数据源,较好定义,而日的数据源即需要根据年与月选择之后,方可获取到那年月的所有日数。如年:
Year
List< int> i_Year { get { List< int> y = new List< int>(); int Ny = DateTime.Now.Year; for ( int i = 1953; i <= Ny; i++) { y.Add(i); } return y; } }
月的数据源:
Month
List< int> i_Month { get { List< int> m = new List< int>(); for ( int i = 1; i <= 12; i++) { m.Add(i); } return m; } }
日的数据源:
Day
由于多个地方是DropDownList数据绑定,因此Insus.NET先写一个通用DropDownList数据绑定的方法: public List< int> i_Day( int year, int month) { int days = DateTime.DaysInMonth(year, month); List< int> d = new List< int>(); for ( int i = 1; i <= days; i++) { d.Add(i); } return d; }
DropDownlistParse
private void DropDownlistParse(DropDownList ddl, object dataSource, string dataTextField, string dataValueField) { ddl.DataSource = dataSource; ddl.DataTextField = dataTextField; ddl.DataValueField = dataValueField; ddl.DataBind(); ddl.Items.Insert( 0, new ListItem( string.Empty, string.Empty)); }
这样的话,在需要绑定的地方,即管传入参数即可。如在Page_Load时,需要对年与月的DropDownList数据绑定:
View Code
protected void Page_Load( object sender, EventArgs e) { if (!IsPostBack) { Data_Binding(); } } private void Data_Binding() { DropDownlistParse( this.DropDownListYear, i_Year.Select(y => new { value = y }).ToList(), " value ", " value "); DropDownlistParse( this.DropDownListMonth, i_Month.Select(m => new { value = m }).ToList(), " value ", " value "); this.DropDownListDay.Items.Insert( 0, new ListItem( string.Empty, string.Empty)); }
在年或月DropDownlist控件有异动时,作相应对日的DropDownList控件数据绑定:
View Code
protected void DropDownListYear_SelectedIndexChanged( object sender, EventArgs e) { DayDataBinding(); } protected void DropDownListMonth_SelectedIndexChanged( object sender, EventArgs e) { DayDataBinding(); } private void DayDataBinding() { if ( this.DropDownListYear.SelectedIndex == - 1 || string.IsNullOrEmpty ( this.DropDownListYear.SelectedItem.Value)) return; if ( this.DropDownListMonth.SelectedIndex == - 1 || string.IsNullOrEmpty( this.DropDownListMonth.SelectedItem.Value)) return; int y = Convert.ToInt32( this.DropDownListYear.SelectedItem.Value); int m = Convert.ToInt32( this.DropDownListMonth.SelectedItem.Value); DropDownlistParse( this.DropDownListDay, i_Day(y, m).Select(d => new { value = d }).ToList(), " value ", " value "); }
我们还要为了获取年月日三个DropDownList控件的值,因此写还得写三个属性:
View Code
private int? _year; private int? _month; private int? _day; public int? Year { get { if (ViewState[ " Year "] != null) { return Convert.ToInt32(ViewState[ " Year "]); } if ( this.DropDownListYear.SelectedIndex == - 1 || string.IsNullOrEmpty( this.DropDownListYear.SelectedItem.Value)) return null; else return Convert.ToInt32( this.DropDownListYear.SelectedItem.Value); } set { ViewState[ " Year "] = value; } } public int? Month { get { if (ViewState[ " Month "] != null) { return Convert.ToInt32(ViewState[ " Month "]); } if ( this.DropDownListMonth.SelectedIndex == - 1 || string.IsNullOrEmpty( this.DropDownListMonth.SelectedItem.Value)) return null; else return Convert.ToInt32( this.DropDownListMonth.SelectedItem.Value); } set { ViewState[ " Month "] = value; } } public int? Day { get { if (ViewState[ " Day "] != null) { return Convert.ToInt32(ViewState[ " Day "]); } if ( this.DropDownListDay.SelectedIndex == - 1 || string.IsNullOrEmpty( this.DropDownListDay.SelectedItem.Value)) return null; else return Convert.ToInt32( this.DropDownListDay.SelectedItem.Value); } set { ViewState[ " Day "] = value; } }
最后是ASCX的html:
View Code
<% @ Control Language = " C# " AutoEventWireup = " true " CodeFile = " InsusDate.ascx.cs " Inherits = " InsusDate " %> < asp:DropDownList ID ="DropDownListYear" runat ="server" AutoPostBack ="true" OnSelectedIndexChanged ="DropDownListYear_SelectedIndexChanged" Width ="60px" ></ asp:DropDownList >年 < asp:DropDownList ID ="DropDownListMonth" runat ="server" AutoPostBack ="true" OnSelectedIndexChanged ="DropDownListMonth_SelectedIndexChanged" Width ="40PX" ></ asp:DropDownList >月 < asp:DropDownList ID ="DropDownListDay" runat ="server" Width ="40PX" ></ asp:DropDownList >日
完整的ASCX.cs:
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class InsusDate : System.Web.UI.UserControl { private int? _year; private int? _month; private int? _day; public int? Year { get { if (ViewState[ " Year "] != null) { return Convert.ToInt32(ViewState[ " Year "]); } if ( this.DropDownListYear.SelectedIndex == - 1 || string.IsNullOrEmpty( this.DropDownListYear.SelectedItem.Value)) return null; else return Convert.ToInt32( this.DropDownListYear.SelectedItem.Value); } set { ViewState[ " Year "] = value; } } public int? Month { get { if (ViewState[ " Month "] != null) { return Convert.ToInt32(ViewState[ " Month "]); } if ( this.DropDownListMonth.SelectedIndex == - 1 || string.IsNullOrEmpty( this.DropDownListMonth.SelectedItem.Value)) return null; else return Convert.ToInt32( this.DropDownListMonth.SelectedItem.Value); } set { ViewState[ " Month "] = value; } } public int? Day { get { if (ViewState[ " Day "] != null) { return Convert.ToInt32(ViewState[ " Day "]); } if ( this.DropDownListDay.SelectedIndex == - 1 || string.IsNullOrEmpty( this.DropDownListDay.SelectedItem.Value)) return null; else return Convert.ToInt32( this.DropDownListDay.SelectedItem.Value); } set { ViewState[ " Day "] = value; } } protected void Page_Load( object sender, EventArgs e) { if (!IsPostBack) { Data_Binding(); } } private void Data_Binding() { DropDownlistParse( this.DropDownListYear, i_Year.Select(y => new { value = y }).ToList(), " value ", " value "); DropDownlistParse( this.DropDownListMonth, i_Month.Select(m => new { value = m }).ToList(), " value ", " value "); this.DropDownListDay.Items.Insert( 0, new ListItem( string.Empty, string.Empty)); } protected void DropDownListYear_SelectedIndexChanged( object sender, EventArgs e) { DayDataBinding(); } protected void DropDownListMonth_SelectedIndexChanged( object sender, EventArgs e) { DayDataBinding(); } private void DayDataBinding() { if ( this.DropDownListYear.SelectedIndex == - 1 || string.IsNullOrEmpty ( this.DropDownListYear.SelectedItem.Value)) return; if ( this.DropDownListMonth.SelectedIndex == - 1 || string.IsNullOrEmpty( this.DropDownListMonth.SelectedItem.Value)) return; int y = Convert.ToInt32( this.DropDownListYear.SelectedItem.Value); int m = Convert.ToInt32( this.DropDownListMonth.SelectedItem.Value); DropDownlistParse( this.DropDownListDay, i_Day(y, m).Select(d => new { value = d }).ToList(), " value ", " value "); } private void DropDownlistParse(DropDownList ddl, object dataSource, string dataTextField, string dataValueField) { ddl.DataSource = dataSource; ddl.DataTextField = dataTextField; ddl.DataValueField = dataValueField; ddl.DataBind(); ddl.Items.Insert( 0, new ListItem( string.Empty, string.Empty)); } List< int> i_Year { get { List< int> y = new List< int>(); int Ny = DateTime.Now.Year; for ( int i = 1953; i <= Ny; i++) { y.Add(i); } return y; } } List< int> i_Month { get { List< int> m = new List< int>(); for ( int i = 1; i <= 12; i++) { m.Add(i); } return m; } } public List< int> i_Day( int year, int month) { int days = DateTime.DaysInMonth(year, month); List< int> d = new List< int>(); for ( int i = 1; i <= days; i++) { d.Add(i); } return d; } }
可以把ASCX保存为一个ASCX用户控件,在网页拉进去即可。