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
}
}