using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace Dongke.WinForm.Controls { /// /// 时间控件,该控件用来让用户选择日期和时间并以【HH:mm:ss】格式显示此时间。 /// [ToolboxBitmap(typeof(DateTimePicker))] public class DtpTime : DateTimeBase, ITimeRange { #region 成员变量 /// /// 最小时间 /// private TimeSpan _minTime = Constant.TimeSpanBeginDay; /// /// 最大时间 /// private TimeSpan _maxTime = Constant.TimeSpanEndDay; /// /// 正在修改时间 /// private bool _isSetting = false; #endregion #region 构造函数 /// /// 时间控件 /// public DtpTime() { base.CustomFormat = Constant.DATETIME_FORMAT_HHMMSS; base.ShowUpDown = true; } #endregion #region 属性 /// /// 获取或设置可在控件中选择的最小时间。 /// [Description("获取或设置可在控件中选择的最小时间。"), Category("CustomerEx")] [DefaultValue(typeof(TimeSpan), "00:00:00"), TypeConverter(typeof(TimeSpanConverter))] public TimeSpan MinTime { get { return this._minTime; } set { TimeSpan ts = new TimeSpan(value.Hours, value.Minutes, value.Seconds); if (ts > this._maxTime) { return; } this._minTime = ts; } } /// /// 获取或设置可在控件中选择的最大时间。 /// [Description("获取或设置可在控件中选择的最大时间。"), Category("CustomerEx")] [DefaultValue(typeof(TimeSpan), "23:59:59"), TypeConverter(typeof(TimeSpanConverter))] public TimeSpan MaxTime { get { return this._maxTime; } set { TimeSpan ts = new TimeSpan(value.Hours, value.Minutes, value.Seconds); if (ts < this._minTime) { return; } this._maxTime = ts; } } /// /// 获取或设置分配给控件的时间值。 /// [Description("获取或设置分配给控件的时间值。"), Category("CustomerEx")] [DefaultValue(typeof(TimeSpan?), "")] [RefreshProperties(RefreshProperties.All)] public new virtual TimeSpan? Value { get { if (base.Value.HasValue) { return base.Value.Value.TimeOfDay; } return null; } set { if (value.HasValue) { if (base.Value.HasValue) { base.Value = base.Value.Value.Date + value; } else { base.Value = DateTime.Now.Date + value; } } else { base.Value = null; } } } #endregion #region 重写属性 /// /// 获取或设置一个值,该值指示是否使用数值调节钮控件(也称为 up-down 控件)调整日期/时间值。 /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [EditorBrowsable(EditorBrowsableState.Never)] public new bool ShowUpDown { get { return base.ShowUpDown; } set { base.ShowUpDown = value; } } /// /// 获取或设置可在控件中选择的最大日期和时间。 /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [EditorBrowsable(EditorBrowsableState.Never)] public new DateTime MaxDate { get { return base.MaxDate; } set { base.MaxDate = value; } } /// /// 获取或设置可在控件中选择的最小日期和时间。 /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [EditorBrowsable(EditorBrowsableState.Never)] public new DateTime MinDate { get { return base.MinDate; } set { base.MinDate = value; } } #endregion #region 重写事件 /// /// 时间改变 /// /// protected override void OnValueChanged(EventArgs e) { if (!base.Value.HasValue) { base.OnValueChanged(e); return; } if (this._isSetting) { return; } this._isSetting = true; DateTime d = base.Value.Value; if (d.TimeOfDay > this._maxTime) { base.Value = d.Date + this._maxTime; } else if (d.TimeOfDay < this._minTime) { base.Value = d.Date + this._minTime; } else { base.OnValueChanged(e); } this._isSetting = false; } #endregion } }