DtpTime.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. 
  2. using System;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Windows.Forms;
  6. namespace Dongke.WinForm.Controls
  7. {
  8. /// <summary>
  9. /// 时间控件,该控件用来让用户选择日期和时间并以【HH:mm:ss】格式显示此时间。
  10. /// </summary>
  11. [ToolboxBitmap(typeof(DateTimePicker))]
  12. public class DtpTime : DateTimeBase, ITimeRange
  13. {
  14. #region 成员变量
  15. /// <summary>
  16. /// 最小时间
  17. /// </summary>
  18. private TimeSpan _minTime = Constant.TimeSpanBeginDay;
  19. /// <summary>
  20. /// 最大时间
  21. /// </summary>
  22. private TimeSpan _maxTime = Constant.TimeSpanEndDay;
  23. /// <summary>
  24. /// 正在修改时间
  25. /// </summary>
  26. private bool _isSetting = false;
  27. #endregion
  28. #region 构造函数
  29. /// <summary>
  30. /// 时间控件
  31. /// </summary>
  32. public DtpTime()
  33. {
  34. base.CustomFormat = Constant.DATETIME_FORMAT_HHMMSS;
  35. base.ShowUpDown = true;
  36. }
  37. #endregion
  38. #region 属性
  39. /// <summary>
  40. /// 获取或设置可在控件中选择的最小时间。
  41. /// </summary>
  42. [Description("获取或设置可在控件中选择的最小时间。"), Category("CustomerEx")]
  43. [DefaultValue(typeof(TimeSpan), "00:00:00"), TypeConverter(typeof(TimeSpanConverter))]
  44. public TimeSpan MinTime
  45. {
  46. get
  47. {
  48. return this._minTime;
  49. }
  50. set
  51. {
  52. TimeSpan ts = new TimeSpan(value.Hours, value.Minutes, value.Seconds);
  53. if (ts > this._maxTime)
  54. {
  55. return;
  56. }
  57. this._minTime = ts;
  58. }
  59. }
  60. /// <summary>
  61. /// 获取或设置可在控件中选择的最大时间。
  62. /// </summary>
  63. [Description("获取或设置可在控件中选择的最大时间。"), Category("CustomerEx")]
  64. [DefaultValue(typeof(TimeSpan), "23:59:59"), TypeConverter(typeof(TimeSpanConverter))]
  65. public TimeSpan MaxTime
  66. {
  67. get
  68. {
  69. return this._maxTime;
  70. }
  71. set
  72. {
  73. TimeSpan ts = new TimeSpan(value.Hours, value.Minutes, value.Seconds);
  74. if (ts < this._minTime)
  75. {
  76. return;
  77. }
  78. this._maxTime = ts;
  79. }
  80. }
  81. /// <summary>
  82. /// 获取或设置分配给控件的时间值。
  83. /// </summary>
  84. [Description("获取或设置分配给控件的时间值。"), Category("CustomerEx")]
  85. [DefaultValue(typeof(TimeSpan?), "")]
  86. [RefreshProperties(RefreshProperties.All)]
  87. public new virtual TimeSpan? Value
  88. {
  89. get
  90. {
  91. if (base.Value.HasValue)
  92. {
  93. return base.Value.Value.TimeOfDay;
  94. }
  95. return null;
  96. }
  97. set
  98. {
  99. if (value.HasValue)
  100. {
  101. if (base.Value.HasValue)
  102. {
  103. base.Value = base.Value.Value.Date + value;
  104. }
  105. else
  106. {
  107. base.Value = DateTime.Now.Date + value;
  108. }
  109. }
  110. else
  111. {
  112. base.Value = null;
  113. }
  114. }
  115. }
  116. #endregion
  117. #region 重写属性
  118. /// <summary>
  119. /// 获取或设置一个值,该值指示是否使用数值调节钮控件(也称为 up-down 控件)调整日期/时间值。
  120. /// </summary>
  121. [Browsable(false)]
  122. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  123. [EditorBrowsable(EditorBrowsableState.Never)]
  124. public new bool ShowUpDown
  125. {
  126. get
  127. {
  128. return base.ShowUpDown;
  129. }
  130. set
  131. {
  132. base.ShowUpDown = value;
  133. }
  134. }
  135. /// <summary>
  136. /// 获取或设置可在控件中选择的最大日期和时间。
  137. /// </summary>
  138. [Browsable(false)]
  139. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  140. [EditorBrowsable(EditorBrowsableState.Never)]
  141. public new DateTime MaxDate
  142. {
  143. get
  144. {
  145. return base.MaxDate;
  146. }
  147. set
  148. {
  149. base.MaxDate = value;
  150. }
  151. }
  152. /// <summary>
  153. /// 获取或设置可在控件中选择的最小日期和时间。
  154. /// </summary>
  155. [Browsable(false)]
  156. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  157. [EditorBrowsable(EditorBrowsableState.Never)]
  158. public new DateTime MinDate
  159. {
  160. get
  161. {
  162. return base.MinDate;
  163. }
  164. set
  165. {
  166. base.MinDate = value;
  167. }
  168. }
  169. #endregion
  170. #region 重写事件
  171. /// <summary>
  172. /// 时间改变
  173. /// </summary>
  174. /// <param name="e"></param>
  175. protected override void OnValueChanged(EventArgs e)
  176. {
  177. if (!base.Value.HasValue)
  178. {
  179. base.OnValueChanged(e);
  180. return;
  181. }
  182. if (this._isSetting)
  183. {
  184. return;
  185. }
  186. this._isSetting = true;
  187. DateTime d = base.Value.Value;
  188. if (d.TimeOfDay > this._maxTime)
  189. {
  190. base.Value = d.Date + this._maxTime;
  191. }
  192. else if (d.TimeOfDay < this._minTime)
  193. {
  194. base.Value = d.Date + this._minTime;
  195. }
  196. else
  197. {
  198. base.OnValueChanged(e);
  199. }
  200. this._isSetting = false;
  201. }
  202. #endregion
  203. }
  204. }