如何在c# DateTimePicker winform 控件中显示和编辑微秒
How to show and edit microseconds in the c# DateTimePicker winform control
我的情况是,应用程序正在接受日期时间精度高达微秒的原始数据文件,WinForms 使用 DateTimePicker
并允许用户修改日期时间。
然而,根据 this,CustomFormat
属性 只允许精确到秒。
行为是这样的:
当我设置
this.dateTimePicker.Value = DateTime.Now;
我可以在保留微秒部分的情况下直接取回值。
但是当用户在DateTimePicker
之前重新选择一个日期时(即使他选择了相同的日期),微秒部分(包括毫秒)将会消失(变成000000
)。
另一个有趣的行为是,即使没有指定控件呈现 HH:mm:ss
,更改为另一个日期仍然会保留 HH:mm:ss
部分。
我也试过第3方控制Infragistics UltraDateTimeEditor
,但是根据this,它也只支持到秒的精度。
因此,我的问题是,有什么方法可以使控制精度达到微秒而不是秒?或者我必须自己制作用户控件来处理这个要求?
我想我会在这里让我的生活更轻松,只需在日期时间选择器的视觉上放置一个 numericupdown,将源日期时间的微秒存储在其中并将它们添加到 datetimepicker.Value用户选择..
dtp.ValueChanged += (sender,args) => {
if(dtp.Tag == "ChangedProgrammatically")
dtp.Tag = null;
else {
dtp.Tag = "ChangedProgrammatically";
dtp.Value = dtp.Value.AddTicks(_microSecNumericUpDown.Value * 10);
}
}
我认为直接设置值也会引发事件,因此使用“ChangedProgrammatically”代码对其进行反跳,但如果没有,则可以将其删除
如果您还想为用户提供编辑微秒的选项,请向其更改的值添加一个事件,该事件采用当前 dtp 值,将其剥离到仅秒精度并将它们添加到:
_microsecNud.ValueChanged += (sender,args) => {
dtp.Tag = "ChangedProgrammatically";
dtp.Value = dtp.Value.AddTicks(microsecNud.Value - (dtp.Value.Ticks % TimeSpan.TicksPerSecond));
}
如果一切顺利,也许将这两个控件捆绑到自定义用户控件中..
我的情况是,应用程序正在接受日期时间精度高达微秒的原始数据文件,WinForms 使用 DateTimePicker
并允许用户修改日期时间。
然而,根据 this,CustomFormat
属性 只允许精确到秒。
行为是这样的: 当我设置
this.dateTimePicker.Value = DateTime.Now;
我可以在保留微秒部分的情况下直接取回值。
但是当用户在DateTimePicker
之前重新选择一个日期时(即使他选择了相同的日期),微秒部分(包括毫秒)将会消失(变成000000
)。
另一个有趣的行为是,即使没有指定控件呈现 HH:mm:ss
,更改为另一个日期仍然会保留 HH:mm:ss
部分。
我也试过第3方控制Infragistics UltraDateTimeEditor
,但是根据this,它也只支持到秒的精度。
因此,我的问题是,有什么方法可以使控制精度达到微秒而不是秒?或者我必须自己制作用户控件来处理这个要求?
我想我会在这里让我的生活更轻松,只需在日期时间选择器的视觉上放置一个 numericupdown,将源日期时间的微秒存储在其中并将它们添加到 datetimepicker.Value用户选择..
dtp.ValueChanged += (sender,args) => {
if(dtp.Tag == "ChangedProgrammatically")
dtp.Tag = null;
else {
dtp.Tag = "ChangedProgrammatically";
dtp.Value = dtp.Value.AddTicks(_microSecNumericUpDown.Value * 10);
}
}
我认为直接设置值也会引发事件,因此使用“ChangedProgrammatically”代码对其进行反跳,但如果没有,则可以将其删除
如果您还想为用户提供编辑微秒的选项,请向其更改的值添加一个事件,该事件采用当前 dtp 值,将其剥离到仅秒精度并将它们添加到:
_microsecNud.ValueChanged += (sender,args) => {
dtp.Tag = "ChangedProgrammatically";
dtp.Value = dtp.Value.AddTicks(microsecNud.Value - (dtp.Value.Ticks % TimeSpan.TicksPerSecond));
}
如果一切顺利,也许将这两个控件捆绑到自定义用户控件中..