DropDownCalendar.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using System;
  2. using System.Windows.Forms;
  3. using System.ComponentModel;
  4. using CustomControls.BaseClasses;
  5. using System.Globalization;
  6. namespace CustomControls.Win32Controls
  7. {
  8. public class DropDownCalendar:DropDownListBase
  9. {
  10. private MonthCalendar _Calendar;
  11. private string _CustomFormat="d";
  12. public event EventHandler DropDown;
  13. public event EventHandler DateChanged;
  14. private bool _SkipTab=false;
  15. [Browsable(false)]
  16. [DefaultValue(typeof(bool),"False")]
  17. public bool SkipTab
  18. {
  19. get{return _SkipTab;}
  20. set{_SkipTab= value;}
  21. }
  22. protected override System.Windows.Forms.Control HostedControl
  23. {
  24. get
  25. {
  26. return Calendar;
  27. }
  28. }
  29. public DateTime Value
  30. {
  31. get{return Calendar.SelectionStart;}
  32. set
  33. {
  34. if(value>=MinDate && value<=MaxDate)
  35. {
  36. Calendar.SelectionStart=value;
  37. this.Text=value.ToString(CustomFormat);
  38. editControl.SelectAll();
  39. OnDateChanged(new EventArgs());
  40. }
  41. else
  42. {
  43. if(value<MinDate){Value=MinDate;}
  44. else{Value=MaxDate;}
  45. }
  46. }
  47. }
  48. public DateTime MaxDate
  49. {
  50. get{return Calendar.MaxDate;}
  51. set{Calendar.MaxDate=value;}
  52. }
  53. public DateTime MinDate
  54. {
  55. get{return Calendar.MinDate;}
  56. set{Calendar.MinDate=value;}
  57. }
  58. [Category("Behavior")]
  59. [DefaultValue(typeof(String),"d")]
  60. public string CustomFormat
  61. {
  62. get{return _CustomFormat;}
  63. set{_CustomFormat= value;}
  64. }
  65. [Browsable(false)]
  66. public virtual MonthCalendar Calendar
  67. {
  68. get
  69. {
  70. if(_Calendar==null)
  71. {
  72. _Calendar=new MonthCalendar();
  73. _Calendar.MouseUp+=new MouseEventHandler(Calendar_MouseUp);
  74. }
  75. return _Calendar;
  76. }
  77. }
  78. public DropDownCalendar()
  79. {
  80. Calendar.MaxSelectionCount=1;
  81. }
  82. protected override void OnDropDown(System.EventArgs e)
  83. {
  84. dropDownForm.Size= new System.Drawing.Size(196,159);
  85. if(DropDown!=null)
  86. {
  87. DropDown(this,e);
  88. }
  89. }
  90. protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg,System.Windows.Forms.Keys keyData)
  91. {
  92. if ( SkipTab && keyData== Keys.Tab){return true;}
  93. return base.ProcessCmdKey(ref msg, keyData);
  94. }
  95. private DateTime GetDefaultDate()
  96. {
  97. if(DateTime.Today>Calendar.MaxDate || DateTime.Today<Calendar.MinDate)
  98. {
  99. return Calendar.MinDate;
  100. }
  101. return DateTime.Today;
  102. }
  103. private void Calendar_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
  104. {
  105. System.Windows.Forms.MonthCalendar.HitTestInfo hitTest;
  106. hitTest=Calendar.HitTest(e.X,e.Y);
  107. if (hitTest.HitArea==MonthCalendar.HitArea.Date && hitTest.Time==Calendar.SelectionStart)
  108. {
  109. DroppedDown=false;
  110. Value=Calendar.SelectionStart;
  111. }
  112. }
  113. protected override void OnDropDownChanged(System.EventArgs e)
  114. {
  115. if (DroppedDown)
  116. {
  117. editControl.ReadOnly=true;
  118. editControl.BackColor=System.Drawing.Color.White;
  119. }
  120. else
  121. {
  122. editControl.ReadOnly=false;
  123. }
  124. base.OnDropDownChanged(e);
  125. }
  126. protected override void OnItemSelected(bool Dropped)
  127. {
  128. if(Dropped)
  129. {
  130. if(Calendar.SelectionStart!=DateTime.MinValue)
  131. {
  132. Value=Calendar.SelectionStart;
  133. }
  134. else
  135. {
  136. Calendar.SelectionStart=DateTime.Today;
  137. Value=DateTime.Today;
  138. }
  139. }
  140. else
  141. {
  142. SetDate();
  143. }
  144. }
  145. private void SetDate()
  146. {
  147. if( ValidateInputText()){Value=Convert.ToDateTime(this.Text);}
  148. else if(this.Text==string.Empty)
  149. {
  150. this.Value=GetDefaultDate();
  151. }
  152. else
  153. {
  154. this.Text=Value.ToString(CustomFormat);
  155. this.editControl.SelectAll();
  156. }
  157. }
  158. private bool ValidateInputText()
  159. {
  160. try
  161. {
  162. DateTime date= Convert.ToDateTime(this.Text);
  163. return true;
  164. }
  165. catch
  166. {
  167. return false;
  168. }
  169. }
  170. protected override void OnNextItem()
  171. {
  172. if(Calendar.SelectionStart>Calendar.MinDate)
  173. {
  174. Calendar.SelectionStart=Calendar.SelectionStart.AddDays(-1);
  175. Value=Calendar.SelectionStart;
  176. }
  177. }
  178. protected override void OnPrevItem()
  179. {
  180. if(Calendar.SelectionStart<Calendar.MaxDate)
  181. {
  182. Calendar.SelectionStart=Calendar.SelectionStart.AddDays(1);
  183. Value=Calendar.SelectionStart;
  184. }
  185. }
  186. protected virtual void OnDateChanged(EventArgs e)
  187. {
  188. if(DateChanged!=null)
  189. {
  190. DateChanged(this,e);
  191. }
  192. }
  193. }
  194. }