可用来显示空值的时间选择控件3
public DateInput()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();
tbMonth.ContextMenu = mnu ;
tbYear.ContextMenu = mnu ;
tbDay.ContextMenu = mnu ;
this.Height = 21 ;
this.Value = DateTime.Now ;
this.DateFormat = "yyyy-MM-dd" ;
if (!this.DesignMode)
CreateCalendar() ;
this.UpDown.Width = 16 ;
this.Refresh() ;
}
private void CreateCalendar()
{
Calendar = new MonthCalendar() ;
Calendar.Visible = true ;
Calendar.DateSelected+=new DateRangeEventHandler(Calendar_DateSelected);
frmCalendar = new Form() ;
frmCalendar.FormBorderStyle = FormBorderStyle.None ;
frmCalendar.TopMost = true ;
frmCalendar.Width = 270 ;
frmCalendar.Height = 145 ;
frmCalendar.Controls.Add(Calendar) ;
Calendar.Dock = DockStyle.Fill ;
frmCalendar.StartPosition = FormStartPosition.Manual ;
frmCalendar.Deactivate+=new EventHandler(Calendar_Leave);
frmCalendar.ShowInTaskbar = false ;
}
private void Calendar_DateSelected(object sender, System.Windows.Forms.DateRangeEventArgs e)
{
this.frmCalendar.Hide() ;
this.Value = this.Calendar.SelectionStart ;
this.tbDay.Focus() ;
}
private void Calendar_Leave(object sender, System.EventArgs e)
{
this.frmCalendar.Hide() ;
//this.Value = this.Calendar.SelectionStart ;
this.tbDay.Focus() ;
}
private void RefreshDisplay()
{
bool blGB = false ;
string strChar = "" ;
if (strDateFormat == "yyyy-MM-dd")
strChar = "-" ;
else if (strDateFormat == "yyyy.MM.dd")
strChar = "." ;
else if (strDateFormat == "yyyy/MM/dd")
strChar = "/" ;
else if (strDateFormat== "yyyy年MM月dd日")
blGB = true ;
else
strChar = strFomatChar ;
if (blGB)
{
lbSep1.Text = "年" ;
lbSep2.Text = "月" ;
lbSep3.Text = "日" ;
}
else
{
lbSep1.Text = strChar ;
lbSep2.Text = strChar ;
lbSep3.Text = "" ;
}
this.Refresh() ;
}
/// <summary>
/// 是不是空值
/// </summary>
public bool IsNull()
{
String strYear = tbYear.Text ;
String strMonth = tbMonth.Text ;
String strDay = tbDay.Text ;
if (strYear == "" ||strMonth == "" ||strDay == "" )
return true ;
else
return false ;
}
/// <summary>
/// 设置值为空(实际为时间的最小值)
/// </summary>
public void SetValueNull()
{
this.Value = DateTime.MinValue ;
}
/// <summary>
/// 清空输入值
/// </summary>
private void EmptyInput()
{
tbYear.Text = "" ;
tbMonth.Text = "" ;
tbDay.Text = "" ;
}
private int GetThisMonthMaxDay()
{
int Year = int.Parse(tbYear.Text) ;
int Month = int.Parse(tbMonth.Text) ;
switch(Month)
{
case 2:
if (DateTime.IsLeapYear(Year))//闰年
return 29 ;
else
return 28 ;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31 ;
case 4:
case 6:
case 9:
case 11:
return 30 ;
default:
return 31 ;
}
}
private void SetRightFmt()
{
if (IsNull())
EmptyInput() ;
else
{
SetRightMonthDay() ;
}
this.Refresh() ;
}
private void SetRightMonthDay()
{
int MaxDay = GetThisMonthMaxDay() ;
int Day = int.Parse(tbDay.Text) ;
if (Day > MaxDay)
tbDay.Text = MaxDay.ToString() ;
}
private void IncDecDate(int iSign)
{
string strYear = tbYear.Text ;
if (strYear == "")
strYear = DateTime.Now.Year.ToString() ;
string strMonth = tbMonth.Text ;
if (strMonth == "")
strMonth = DateTime.Now.Month.ToString() ;
string strDay = tbDay.Text ;
if (strDay == "")
strDay = DateTime.Now.Day.ToString() ;
string strDate = strYear +"-"+ strMonth +"-" +strDay ;
DateTime dtOld = DateTime.Parse(strDate) ;
if (tbYear.Focused)
{
this.Value = dtOld.AddYears(1*iSign) ;
}
else if (tbMonth.Focused)
{
this.Value = dtOld.AddMonths(1*iSign) ;
}
else
{
this.Value = dtOld.AddDays(1*iSign) ;
}
}
private Form GetWindow()
{
Control con = this ;
while(!(con.Parent is Form))
con = con.Parent ;
return (Form)con.Parent ;
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}